10

在下面的代码中,当用户在组合框中选择客户时,客户的姓名会显示在文本框中。我用 ViewModel 上的 ObservableCollection 属性填充 Combox 框,但是如何处理 ViewModel 中的 SelectedItem 事件?

使用代码隐藏很容易实现这一点,如下所示,但是如何使用 MVVM 模式来实现呢?

我目前在我可以使用的基本 MVVM 模板中有DelegateCommandAttachedBehaviors ,但我不知道如何让它们在“组合框选择新项目”时触发。

看法:

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

2 回答 2

12

您应该能够将 ViewModel 中的属性绑定到组合框的 SelectedItem 属性。如果您将其设置为双向绑定,您将在 SelectedItem 更改时收到通知,因为它将触发属性上的 set 方法。

视图模型:

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

xml:

<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>
于 2009-06-18T09:38:00.970 回答
10

在 www.codeproject.com 上查看此应用程序。这里我使用CollectionView来检测当前选中的item

更新

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

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

请记住还要设置 IsSynchronizedWithCurrentItem="True"

于 2009-06-18T09:38:56.430 回答