728x90
반응형
WPF에서 MVVM 패턴을 사용할 때, 일반적으로 View는 단일 ViewModel을 참조하고, ViewModel은 단일 View를 참조하지 않는 것이 원칙입니다. 이는 MVVM 패턴의 명확한 역할 분리를 유지하기 위해서입니다. 그러나 경우에 따라 View가 여러 ViewModel을 참조하거나 ViewModel이 여러 View를 참조해야 할 필요가 있을 수 있습니다.
View가 여러 ViewModel을 참조하는 경우
View가 여러 ViewModel을 참조해야 하는 경우, DataContext를 설정하거나 여러 ViewModel을 리소스로 추가하여 사용할 수 있습니다.
<!-- MainView.xaml -->
<Window x:Class="MVVMExample.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainView" Height="350" Width="525">
<Window.Resources>
<local:FirstViewModel x:Key="FirstViewModel" />
<local:SecondViewModel x:Key="SecondViewModel" />
</Window.Resources>
<Grid>
<StackPanel>
<!-- First ViewModel binding -->
<TextBlock Text="{Binding Source={StaticResource FirstViewModel}, Path=FirstName}" />
<!-- Second ViewModel binding -->
<TextBlock Text="{Binding Source={StaticResource SecondViewModel}, Path=LastName}" />
</StackPanel>
</Grid>
</Window>
ViewModel 클래스들
// FirstViewModel.cs
public class FirstViewModel
{
public string FirstName { get; set; } = "John";
}
// SecondViewModel.cs
public class SecondViewModel
{
public string LastName { get; set; } = "Doe";
}
ViewModel이 여러 View를 참조하는 경우
ViewModel이 여러 View와 상호작용해야 하는 경우, 이벤트를 사용하거나 메신저 패턴을 사용하여 View와 통신할 수 있습니다. ViewModel은 직접 View를 참조하지 않는 것이 좋지만, 필요하다면 INotifyPropertyChanged 인터페이스를 통해 View에 변경 사항을 알릴 수 있습니다.
예제: ViewModel이 여러 View와 상호작용
// MainViewModel.cs
public class MainViewModel : INotifyPropertyChanged
{
private string _message;
public string Message
{
get => _message;
set
{
_message = value;
OnPropertyChanged();
}
}
public ICommand ShowMessageCommand { get; }
public MainViewModel()
{
ShowMessageCommand = new RelayCommand(ShowMessage);
}
private void ShowMessage()
{
Message = "Hello from MainViewModel!";
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
// RelayCommand.cs (for ICommand implementation)
public class RelayCommand : ICommand
{
private readonly Action _execute;
public RelayCommand(Action execute)
{
_execute = execute;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter) => true;
public void Execute(object parameter)
{
_execute();
}
}
MainView.xaml
<Window x:Class="MVVMExample.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainView" Height="350" Width="525">
<Grid>
<StackPanel>
<TextBlock Text="{Binding Message}" />
<Button Command="{Binding ShowMessageCommand}" Content="Show Message" />
</StackPanel>
</Grid>
</Window>
결론
- View는 여러 ViewModel을 참조할 수 있으며, 이를 위해 리소스를 정의하고 바인딩할 수 있습니다.
- ViewModel이 여러 View와 상호작용할 때는 이벤트나 메신저 패턴을 사용하여 간접적으로 참조하는 것이 좋습니다.
728x90
반응형
'Programming > C# WPF' 카테고리의 다른 글
WPF .NET과 .NET Framework 차이 (0) | 2024.07.02 |
---|---|
[C# WPF] Button Style Custom 방법 (0) | 2019.06.12 |
[C# WPF] ICommand를 활용한 버튼 커맨드 방법 (0) | 2019.03.04 |
[C# WPF] Window화면 Custom하기 (0) | 2018.09.05 |
C# WPF] INotifyPropertyChanged 인터페이스를 이용한 데이터 바인딩 방법 (1) | 2018.04.17 |