MVVM으로 SelectedItem 이벤트를 처리하는 가장 쉬운 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1011750

  •  06-07-2019
  •  | 
  •  

문제

아래 코드에서 사용자가 고객을 선택할 때 Combobox에서 고객의 이름이 표시됩니다 텍스트 상자에서. COMBox 상자를 내 ViewModel의 관측형 수집 속성으로 채우지 만 ViewModel에서 SelectedItem 이벤트를 어떻게 처리합니까?

아래 그림과 같이 코드 베어드로이를 구현하기는 쉽지만 MVVM 패턴으로 어떻게해야합니까?

나는 현재 가지고있다 대표 명령 그리고 첨부 된 비하비기 내가 사용할 수있는 기본 MVVM 템플릿에서 "Combobox가 새 항목을 선택할 때"어떻게 발사하는지 알 수는 없습니다.

보다:

<Window.Resources>
    <DataTemplate x:Key="CustomerTemplate">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding LastName}"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

<DockPanel LastChildFill="False" Margin="10">
    <ComboBox 
        x:Name="CustomerList"
        ItemTemplate="{StaticResource CustomerTemplate}"
        HorizontalAlignment="Left"
        DockPanel.Dock="Top" 
        Width="200"
        SelectionChanged="CustomerSelected"
        ItemsSource="{Binding Customers}"/>

    <TextBlock x:Name="CurrentlySelectedCustomer"/>
</DockPanel>

뒤에 코드 :

private void CustomerSelected(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    Customer customer = (Customer)CustomerList.SelectedItem;
    CurrentlySelectedCustomer.Text = String.Format("{0} {1}", customer.FirstName, customer.LastName);
}
도움이 되었습니까?

해결책

Combobox의 선택된 속성에 뷰 모델의 속성을 바인딩 할 수 있어야합니다. 이것을 양방향 바인딩으로 설정하면 SELECTEDITEM이 변경되면 속성의 설정 메소드가 트리거되므로 알림을받습니다.

ViewModel :

public ObservableCollection Customers
{
   get { return _customers; }
   set
   {
       if (_customers != value)
       {
           _customers = value;
           OnPropertyChanged("Customers");
       }
   }
}

public Customer SelectedCustomer
{
   get { return _selectedCustomer; }
   set
   {
       if (_selectedCustomer != value)
       {
           _selectedCustomer= value;
           LastName= value.LastName;
           OnPropertyChanged("SelectedCustomer");
       }
   }
}

public Customer LastName
{
   get { return _lastName; }
   set
   {
       if (_lastName!= value)
       {
           _lastName= value;
           OnPropertyChanged("LastName");
       }
   }
}

XAML :

<DockPanel LastChildFill="False" Margin="10">
    <ComboBox 
        x:Name="CustomerList"
        ItemTemplate="{StaticResource CustomerTemplate}"
        HorizontalAlignment="Left"
        DockPanel.Dock="Top" 
        Width="200"
        SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"
        ItemsSource="{Binding Customers}"/>

    <TextBlock x:Name="CurrentlySelectedCustomer"
               Text="{Binding LastName}"/>
</DockPanel>

다른 팁

살펴보십시오 이것 www.codeproject.com의 응용 프로그램. 여기서는 CollectionView를 사용하여 현재 선택한 항목을 감지합니다.

업데이트

CollectionView를 사용하여 현재 선택된 항목을 감지합니다

ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(Customers); 
view.CurrentChanged += delegate 
{ 
    SelectedCustomer= (Customer)view.CurrentItem; 
};

istynchronizedwithCurrentItem = "true"를 설정하는 것을 잊지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top