什么是MVVM来处理事件的SelectedItem最简单的方法?(What is the easie

2019-07-28 21:52发布

在下面的代码, 当用户在组合框中选择客户客户的名字显示在文本框中。 我充满了对我的ViewModel一个ObservableCollection财产COMBOX框,但我怎么处理我的视图模型中的SelectedItem事件?

这很容易与代码隐藏来实现这一如下图所示,但我要如何做到这一点与MVVM模式?

我现在有DelegateCommandAttachedBehaviors在我,我可以使用基本的MVVM模板,但我无法弄清楚如何让他们当“组合框中选择一个新的项目”开火。

视图:

<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);
}

Answer 1:

你应该能够在你的ViewModel到ComboBox的SelectedItem属性的属性绑定。 如果其设置为双向绑定时的SelectedItem改变会通知您,因为它会触发属性的设置方法。

视图模型:

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>


Answer 2:

看看这对www.codeproject.com应用。 在这里,我使用的CollectionView来检测当前选定的项目

更新

使用的CollectionView检测当前所选项目

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

只记得还设置IsSynchronizedWithCurrentItem =“真”



文章来源: What is the easiest way to handle SelectedItem event with MVVM?