C#/C# 프로그래밍

[C#프로그래밍] [WPF] PC 카카오톡 만들기 #12 - Dependency Injection(DI) IoC를 이용한 ViewModel간 데이터 전달

냠냠쿠 2023. 8. 30. 13:27
728x90
https://www.youtube.com/watch?v=_KXr5dGGS3s&list=PLlrfTSXS0LLKHfOfwM31jJw3SHuDnkF49&index=13

 

 📌 폴더 재 세팅 및 View 수정

더보기

-LoginView.xaml

<UserControl x:Class="WpfDINavigation.Views.LoginView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfDINavigation.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">

    <UserControl.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="Control.FontSize" Value="20"/>
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Control.FontSize" Value="20"/>
        </Style>
    </UserControl.Resources>
    <Grid Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TextBlock Text="LoginView"
               HorizontalAlignment="Center"
               FontSize="35"
               />
        <Border Grid.Row="1" Padding="50">
            <StackPanel>
                <Grid Height="50">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="아이디"/>
                    <TextBox Grid.Column="1" Text="{Binding Id}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="비밀번호"/>
                    <TextBox Grid.Column="1" Text="{Binding Password}"/>
                </Grid>
            </StackPanel>
        </Border>

        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <Button Command="{Binding ToSignupCommand}"
              Content="회원가입"
              Margin="5"/>
            <Button Command="{Binding ToTestCommand}"
              Grid.Column="1"
              Content="ToTest" 
              Margin="5"/>
        </Grid>
    </Grid>
</UserControl>

 

-SignupView.xaml

<UserControl x:Class="WpfDINavigation.Views.SignupView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfDINavigation.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="Control.FontSize" Value="20"/>
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Control.FontSize" Value="20"/>
        </Style>
    </UserControl.Resources>
    <Grid Background="Yellow">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TextBlock Text="SignupView"
               HorizontalAlignment="Center"              
               FontSize="35"
               />
        <Border Grid.Row="1" Padding="50">
            <StackPanel>
                <Grid Height="50">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="아이디"/>
                    <TextBox Grid.Column="1" Text="{Binding Id}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이름"/>
                    <TextBox Grid.Column="1" Text="{Binding Name}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이메일"/>
                    <TextBox Grid.Column="1" Text="{Binding Email}"/>
                </Grid>

                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="비밀번호"/>
                    <TextBox Grid.Column="1" Text="{Binding Password}"/>
                </Grid>
            </StackPanel>
        </Border>

        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <Button Command="{Binding ToLoginCommand}"
              Content="ToLogin" Margin="5"/>
            <Button Command="{Binding ToTestCommand}"
              Grid.Column="1"
              Content="ToTest" Margin="5"/>
        </Grid>
    </Grid>
</UserControl>

 

-TestView.xaml

<UserControl x:Class="WpfDINavigation.Views.TestView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfDINavigation.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <DataTemplate DataType="{x:Type viewmodels:LeftViewModel}">
            <local:LeftView/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewmodels:RightViewModel}">
            <local:RightView/>
        </DataTemplate>
    </UserControl.Resources>
    <Grid Background="SkyBlue">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TextBlock Text="TestView"
               HorizontalAlignment="Center"
               VerticalAlignment="Center"
               FontSize="35"
               />

        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <ContentControl Grid.Column="0"
                      Content="{Binding LeftViewModel}"
                      Margin="5"/>
            <ContentControl Grid.Column="1" 
                      Content="{Binding RightViewModel}" 
                      Margin="5"/>
        </Grid>

        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <Button Command="{Binding ToSignupCommand}"
              Content="ToSignup" Margin="5"/>
            <Button Command="{Binding ToLoginCommand}"
              Grid.Column="1"
              Content="ToLogin" Margin="5"/>
        </Grid>
    </Grid>
</UserControl>

 

-LeftView.xaml

<UserControl x:Class="WpfDINavigation.Views.TestContols.LeftView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfDINavigation.Views.TestContols"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="Control.FontSize" Value="20"/>
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Control.FontSize" Value="20"/>
        </Style>
    </UserControl.Resources>
    <Grid Background="AliceBlue">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TextBlock Text="LeftView"
               HorizontalAlignment="Center"
               FontSize="35"
               />

        <Border Grid.Row="1" Padding="50">
            <StackPanel>
                <Grid Height="50">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="아이디"/>
                    <TextBox Grid.Column="1" Text="{Binding Id}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이름"/>
                    <TextBox Grid.Column="1" Text="{Binding Name}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이메일"/>
                    <TextBox Grid.Column="1" Text="{Binding Email}"/>
                </Grid>

                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="비밀번호"/>
                    <TextBox Grid.Column="1" Text="{Binding Password}"/>
                </Grid>
            </StackPanel>
        </Border>

        <Button Grid.Row="2" 
            Content="데이터 전송"
            Command="{Binding SendAccountToRightCommand}"/>
    </Grid>
</UserControl>

 

-RightView.xaml

<UserControl x:Class="WpfDINavigation.Views.TestContols.RightView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfDINavigation.Views.TestContols"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="Control.FontSize" Value="20"/>
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Control.FontSize" Value="20"/>
        </Style>
    </UserControl.Resources>
    <Grid Background="GreenYellow">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TextBlock Text="RightView"
               HorizontalAlignment="Center"
               FontSize="35"
               />

        <Border Grid.Row="1" Padding="50">
            <StackPanel>
                <Grid Height="50">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="아이디"/>
                    <TextBox Grid.Column="1" Text="{Binding Id}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이름"/>
                    <TextBox Grid.Column="1" Text="{Binding Name}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이메일"/>
                    <TextBox Grid.Column="1" Text="{Binding Email}"/>
                </Grid>

                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="비밀번호"/>
                    <TextBox Grid.Column="1" Text="{Binding Password}"/>
                </Grid>
            </StackPanel>
        </Border>

        <Button Grid.Row="2"
            Content="데이터 전송"
            Command="{Binding SendAccountToLeftCommand}"/>
    </Grid>
</UserControl>

 

 

📌 바인딩 추가하기 

- 뷰가 완전히 바껴서 까불님의 코드를 복붙해왔더니 이미 바인딩이 되어있었기 때문에 .xaml 코드는 위 접힌 코드에 적어두었다.

  LoginViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using WpfDINavigation.Commands;
using WpfDINavigation.Services;

namespace WpfDINavigation.ViewModels.MainControlViewModels
{
    public class LoginViewModel : ViewModelBase
    {
        //필드부분은 최상위에 두는 것이 관례이다.
        private readonly INavigationService _navigationService;
        private readonly SignupStore _signupStore;
        private string _id = "";
        private string _password = "";

        private void ToSignup(object _)
        {
            _signupStore.CurrentAccount = new Models.Account { Id = Id, Password = Password };
            _navigationService.Navigate(NaviType.SignupView);
        }

        private void ToTest(object _)
        {
            _navigationService.Navigate(NaviType.TestView);
        }

        public LoginViewModel(INavigationService navigationService, SignupStore signupStore)
        {
            _navigationService = navigationService;
            _signupStore = signupStore;

            ToSignupCommand = new RelayCommand<object>(ToSignup);
            ToTestCommand = new RelayCommand<object>(ToTest);
        }

        public string Id
        {
            get { return _id; }
            set
            {
                if (_id != value)
                {
                    //아이디 변경이 있는 경우 OnPropertyChanged
                    _id = value;
                    OnPropertyChanged();
                }
            }
        }

        public string Password
        {
            get { return _password; }
            set
            {
                if (_password != value)
                {
                    //비번 변경이 있는 경우 OnPropertyChanged
                    _password = value;
                    OnPropertyChanged();
                }
            }
        }

        public ICommand ToSignupCommand { get; set; }
        public ICommand ToTestCommand { get; set; }
    }
}

 

  LoginView → SignupView 

1. Stores 폴더에 클래스 SignupStroe.cs 파일 생성 

- SignupStore.cs

namespace WpfDINavigation.Stores
{
    public internal class SignupStore
    {
        //모델을 전송 할 수 있도록 모델 생성
        public Account MyProperty { get; set; }
    }
}

 

2. Models 폴더에 클래스 Account.cs 파일 생성

-Account.cs 

namespace WpfDINavigation.Models
{
    public internal class Account
    {
        public string ID { get; set; } = default!;
        public  string Password { get; set; } = default!;
        public  string name { get; set; } = default!;
        public  string Email { get; set; } = default!;
    }
}

 

다시 SignupStore 로 돌아가서 Control + . 눌러서 네임스페이스에 Account 추가 및 이름 변경

- SignupStore.cs

namespace WpfDINavigation.Stores
{
    public class SignupStore
    {
        //모델을 전송 할 수 있도록 모델 생성
        public Account CurrentAccount { get; set; }
    }
}

 

3. SignupStore를 Service에 등록

    public partial class App : Application
    {
        //자기 자신을 호출 Current은 타입이 Application이기 때문에 App 타입으로 으로 변환
            public new static App Current => (App)Application.Current;
            private IServiceProvider ConfigureServices()
            {
                var services = new ServiceCollection();

                // Stores
                services.AddSingleton<MainNavigationStore>();
                services.AddSingleton<SignupStore>();
                
                ...

 

 

- LoginViewModel.cs

		private void ToSignup(object _)
        {
            // 네비게이트 전 signupStore 에 CurrentAccount 전달
            // id, pw는 기존 프로퍼티에 있던 것들 을 넣어준다.
            _signupStore.CurrentAccount = new Models.Account { Id = Id, Password = Password };
            _navigationService.Navigate(NaviType.SignupView);
        }

        private void ToTest(object _)
        {
            _navigationService.Navigate(NaviType.TestView);
        }

        //생성자 부분에 SignupStore 호출을 받아준다.
        public LoginViewModel(INavigationService navigationService, SignupStore signupStore)
        {
            _navigationService = navigationService;
            _signupStore = signupStore;

            ToSignupCommand = new RelayCommand<object>(ToSignup);
            ToTestCommand = new RelayCommand<object>(ToTest);
        }
        
        ...

 

- SignupViewModel.cs

    public class SignupViewModel : ViewModelBase
    {
        private readonly INavigationService _navigationService;
        private readonly SignupStore _signupStore;
        
        ...
        
        //Initialize생성 
        private void Initialize()
        {
            Id = CurrentAccount.Id;
            Password = CurrentAccount.Password;
        }


		//생성자에 signupStore 추가 
        public SignupViewModel(INavigationService navigationService, SignupStore signupStore,)
        {
            _navigationService = navigationService;
            _signupStore = signupStore;

            Initialize();

            ToLoginCommand = new RelayCommand<object>(ToLogin);
            ToTestCommand = new RelayCommand<object>(ToTest);
        }

 

4. 바인딩 처리

- SignupView.xaml

			...

                   <TextBlock Grid.Column="0" Text="아이디"/>
                    <TextBox Grid.Column="1" Text="{Binding Id}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이름"/>
                    <TextBox Grid.Column="1" Text="{Binding Name}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이메일"/>
                    <TextBox Grid.Column="1" Text="{Binding Email}"/>
                </Grid>

                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="비밀번호"/>
                    <TextBox Grid.Column="1" Text="{Binding Password}"/>
                </Grid>
            </StackPanel>
            
            ...

 

   SignupView   TestView 

 

1. LeftView 

- Stores에 클래스 LeftStore, RightStore 추가 

 

- LeftStore .cs

namespace WpfDINavigation.Stores
{
    public  class LeftStore
    {
        public Account? CurrentAccount { get; set; }

    }
}

 

- Rightstore.cs

namespace WpfDINavigation.Stores
{
    public class RightStroe
    {
        public Account? CurrentAccount { get; set; }
    }
}

 

- 서비스 등록

- App.xaml.cs

                // Stores
                services.AddSingleton<MainNavigationStore>();
                services.AddSingleton<SignupStore>();
                services.AddSingleton <LeftStore>();
                services.AddSingleton<RightStroe>();

 

- SignupViewModel.cs

        private void ToTest(object _)
        {
            _leftStore.CurrentAccount = new Account()
            {
                Id = Id,
                Password = Password,
                Name = Name,
                Email = Email,
            };
            _navigationService.Navigate(NaviType.TestView);
        }

		...

        //생성자에 signupStore , LeftStore추가 
        public SignupViewModel(INavigationService navigationService, SignupStore signupStore, LeftStore leftStore)
        {
            _navigationService = navigationService;
            _signupStore = signupStore;
            _leftStore = leftStore;

            Initialize();

            ToLoginCommand = new RelayCommand<object>(ToLogin);
            ToTestCommand = new RelayCommand<object>(ToTest);
        }

 

- ViewModel 작성

- LeftViewModel.cs

namespace WpfDINavigation.ViewModels.TestControlViewModel
{
    public class LeftViewModel : ViewModelBase
    {

        private readonly LeftStore _leftStore;

        public LeftViewModel(LeftStore leftStore)
        {
            this._leftStore = leftStore;
        }
    }
}

 

- LeftView에서 바인딩 처리

- LeftView.xaml

        <Border Grid.Row="1" Padding="50">
            <StackPanel>
                <Grid Height="50">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="아이디"/>
                    <TextBox Grid.Column="1" Text="{Binding Id}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이름"/>
                    <TextBox Grid.Column="1" Text="{Binding Name}"/>
                </Grid>
                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="이메일"/>
                    <TextBox Grid.Column="1" Text="{Binding Email}"/>
                </Grid>

                <Grid Height="50" Margin="0 5 0 0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0" Text="비밀번호"/>
                    <TextBox Grid.Column="1" Text="{Binding Password}"/>
                </Grid>
            </StackPanel>
        </Border>

 

- ViewModel 추가 수정 (속성추가)

- LeftViewModel.cs

    public class LeftViewModel : ViewModelBase
    {
        private string _id = "";
        private string _password = "";
        private string _name = "";
        private string _email = "";
        private readonly LeftStore _leftStore;
        private Account CurruntAccount => _leftStore.CurrentAccount!;

        private void Initialize()
        {
            Id = CurruntAccount.Id;
            Password = CurruntAccount.Password;
            Name = CurruntAccount.Name;
            Email = CurruntAccount.Email;
        }


        public string Id
        {
            get { return _id; }
            set
            {
                if (_id != value)
                {
                    _id = value;
                    OnPropertyChanged();
                }
            }
        }

        public string Password
        {
            get { return _password; }
            set
            {
                if (_password != value)
                {
                    _password = value;
                    OnPropertyChanged();
                }
            }
        }

        public string Name
        {
            get { return _name; }
            set
            {
                if (_name != value)
                {
                    _name = value;
                    OnPropertyChanged();
                }
            }
        }

        public string Email
        {
            get { return _email; }
            set
            {
                if (_email != value)
                {
                    _email = value;
                    OnPropertyChanged();
                }
            }
        }

        public LeftViewModel(LeftStore leftStore)
        {
            this._leftStore = leftStore;
            Initialize();
        }
    }
}

 

- 상단에 xmlns:viewmodels="clr-namespace:WpfDINavigation.ViewModels" 형식으로 지정되어있던 경로가 폴더생성이 되다보니 인식을 하지 못해서 xmlns:viewmodels="clr-namespace:WpfDINavigation.ViewModels.TestControlViewModel" 과 같이 하위폴더를 명확하게 지정해 주었다.

- 실행을 해 보면, 아이디 비밀번호를 입력하고 회원가입을 누르면 그대로 데이터 전송이 되는 것을 볼 수 있다.

 

📌데이터 전송 기능 구현하기

- 같은 TestView에 있기 때문에 네비게이트는 하지 않아도 된다. 

- LeftViewModel.cs

        private Account CurrentAccount => _leftStore.CurrentAccount!;
        
		private void SendAccountToRight(object _)
        {
            _rightStore.CurrentAccount = new Account
            {
                Id = Id,
                Password = Password,
                Name = Name,
                Email = Email,
            };
        }

		public LeftViewModel(LeftStore leftStore, RightStore rightStore)
        {
            _leftStore = leftStore;
            _rightStore = rightStore;
            SendAccountToRightCommand = new RelayCommand<object>(SendAccountToRight);
            Initialize();

            _leftStore.CurrentAccountChanged += CurrentAccountChanged;
        }

		public LeftViewModel(LeftStore leftStore, RightStore rightStore)
        {
            _leftStore = leftStore;
            _rightStore = rightStore;
            SendAccountToRightCommand = new RelayCommand<object>(SendAccountToRight);
            Initialize();

            _leftStore.CurrentAccountChanged += CurrentAccountChanged;
        }
        
        ...
        
        
         public ICommand SendAccountToRightCommand { get; set; }

 

- LeftView.xaml

        <Button Grid.Row="2" 
            Content="데이터 전송"
            Command="{Binding SendAccountToRightCommand}"/>

 

- rightView에도 똑같이 작업을 해 준다.

 

 

728x90