MVVM 패턴에서의 명확한 역할 분리 방법

2024. 6. 30. 14:06·Programming/C# WPF
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의 IMultiValueConverter와 IValueConverter: 차이점, 장단점, 그리고 활용 방법  (1) 2025.01.25
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
'Programming/C# WPF' 카테고리의 다른 글
  • WPF의 IMultiValueConverter와 IValueConverter: 차이점, 장단점, 그리고 활용 방법
  • WPF .NET과 .NET Framework 차이
  • [C# WPF] Button Style Custom 방법
  • [C# WPF] ICommand를 활용한 버튼 커맨드 방법
이프로그
이프로그
리뷰, 개발, 일상을 기록하는 블로그
    반응형
    250x250
  • 이프로그
    이프로그의 IT이야기
    이프로그
  • 전체
    오늘
    어제
    • 분류 전체보기 (158)
      • Programming (111)
        • C# WPF (11)
        • Java Spring (16)
        • JavaScript & TypeScript (5)
        • Git (9)
        • Database (5)
        • Etc (42)
      • 생활상식 (24)
      • 리뷰 (8)
      • 주식 (12)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      javascript
      자바스크립트 트릭
      소프트웨어 개발
      클라우드 컴퓨팅
      이슈 트래킹
      서버 관리
      투자전략
      docker
      데이터 바인딩
      분산 메시징 시스템
      dynamicresource
      Kubernetes
      클라우드 네이티브
      협업 도구
      마이크로서비스
      WPF
      XAML
      C# WPF
      재테크
      DevOps
      데이터베이스 성능
      투자
      주식투자
      rest api
      데이터 파이프라인
      ES6
      웹 개발
      Java
      Apache Kafka
      java8
    • 최근 댓글

    • 최근 글

    이프로그
    MVVM 패턴에서의 명확한 역할 분리 방법
    상단으로

    티스토리툴바