programing

wpf에서 MVVM이 있는 ComboBox의 SelectionChanged 이벤트를 처리하는 방법은 무엇입니까?

powerit 2023. 5. 13. 11:04
반응형

wpf에서 MVVM이 있는 ComboBox의 SelectionChanged 이벤트를 처리하는 방법은 무엇입니까?

시스템을 상승/처리하는 방법SelectionChangedWPF 이벤트ComboBoxMVVM 패턴을 사용하시겠습니까?
WPF가 처음이라 자세히 설명해주세요.

내가 원하는 것은, 수술을 하는 것입니다.ComboBox항목 선택이 변경되었습니다.MVVM 방식으로 이를 달성하려면 어떻게 해야 합니까?

MVVM 솔루션:

바인딩:ItemsSource그리고.SelectedItem의 속성ComboBoxView Model의 속성으로 이동:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/>

MainViewModel.cs 에서:

public ObservableCollection<string> MyItems { get; set; }

private string _mySelectedItem;
public string MySelectedItem
{
  get { return _mySelectedItem; }
  set
  {
    // Some logic here
    _mySelectedItem = value;
  }
}

코드백 솔루션:

MVVM을 사용하지 않으려면 다음을 추가할 수 있습니다.

 <ComboBox SelectionChanged="ComboBox_SelectionChanged" />

MainWindow.xaml.cs 에 다음 정보를 추가합니다.

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Some logic here
}

저는 이 방법의 열렬한 팬입니다.

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

<ComboBox Grid.Column="2"  DisplayMemberPath="Data.name" ItemsSource="{Binding Model.Regions}" SelectedItem="{Binding Model.SelectedRegion}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding RegionChangedCmd}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>

View 모델은 INOTIFY를 구현해야 합니다.속성이 변경되었습니다.

public class MyViewModel : INotifyPropertyChanged
{
    private string _mySelectedItem;
    public string MySelectedItem
    {
        get
        {
            return _mySelectedItem;
        }
        set
        {
            if (_mySelectedItem != value)
            {
                _mySelectedItem = value;
                // Perform any pre-notification process here.
                if (null != PropertyChanged)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("MySelectedItem"));
                }
            }
        }
    } 
}

이전에 게시된 XAML은 다음과 같습니다.

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/> 

위의 솔루션을 개선한 것일 뿐입니다. 프리즘 라이브러리를 사용하는 경우
(그렇지 않다면, 이제 그만 읽으세요, 당신을 위한 것은 아무것도 없어요)

저는 이 솔루션이 정말 마음에 들고 다른 어떤 솔루션보다 좋다고 생각합니다. 프리즘 라이브러리에서 제공하는 솔루션을 조금 개선하고 싶습니다.

해당 솔루션이 사용 중인

<i:InvokeCommandAction Command="{Binding RegionChangedCmd}" />

눈치 채다i:이전에InvokeCommandAction그것은 의미는InvokeCommandAction클래스가 존재합니다.xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"네임스페이스입니다.이것은 좋고 괜찮지만, 프리즘 라이브러리는 정확히 같은 이름을 가진 같은 클래스를 가지고 있습니다.InvokeCommandAction그것은 단지 다른 네임스페이스, 즉xmlns:prism="http://prismlibrary.com/"네임스페이스입니다.

따라서 실제로 다음 XAML을 대체할 수 있습니다.

<i:InvokeCommandAction Command="{Binding RegionChangedCmd}" />

이 XAML로

<prism:InvokeCommandAction Command="{Binding RegionChangedCmd}" />

좋아요, 할 수 있어요, 어떤 혜택이 있나요?
이점을 확인하려면 View Model에 다음 명령을 입력합니다.

public ICommand RegionChangedCmd { get; }

public ViewModelConstructor() 
{
   RegionChangedCmd = new DelegateCommand<SelectionChangedEventArgs>(RegionChangedCmdExecuted);
}

public void RegionChangedCmdExecuted(SelectionChangedEventArgs e)
{
   // e parameter is null     if you use <i:InvokeCommandAction>
   // e parameter is NOT null if you use <prism:InvokeCommandAction>
}

e 매개 변수를 사용하는 경우 null입니다.<i:InvokeCommandAction>
사용하는 경우 e 매개 변수가 null이 아닙니다.<prism:InvokeCommandAction>

먼저, 이벤트를 변경할 수 없고 구독할 수 있다는 점을 분명히 해둡시다.

선택 변경을 처리할 위치에 대한 정보를 제공하지 않았기 때문에 가장 일반적인 시나리오인 기본 보기 모델의 처리를 가정하겠습니다.MVVM에 따르면 View Model은 View에 대해 아무것도 알지 못하므로 View Model에서 View 컨트롤 이벤트에 직접 가입할 수 없습니다.그러나 ViewModel의 속성을 다음 중 하나에 바인딩할 수 있습니다.SelectedItem또는SelectedIndex선택이 변경되는 동안 트리거될 수 있습니다.

<ComboBox 
       SelectedIndex="{Binding SelectedIndexPropertyName}" 
       ... />

다음을 통해 View 모델에 액세스하여 View 뒤의 코드에서 처리하는 다른 솔루션이 있습니다.view.DataContext하지만 그런 관행은 피하는 게 좋겠어요, 이건 사건을 해결하는 일이에요.

언급URL : https://stackoverflow.com/questions/8666256/how-to-handle-the-selectionchanged-event-of-combobox-with-mvvm-in-wpf

반응형