代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

使用MVVM处理SelectedItem事件的最简单方法是什么?

  •  10
  • Edward Tanguay  · 技术社区  · 16 年前

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

    这很容易实现,代码隐藏如下,但是 如何使用MVVM模式进行此操作?

    我现在有 委托代理 附件B航空公司 在我的基本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);
    }
    
    2 回复  |  直到 16 年前
        1
  •  12
  •   Martin Harris    16 年前

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

    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>
    
        2
  •  10
  •   rudigrobler    16 年前

    看一看 this www.codeproject.com上的应用程序。在这里,我使用CollectionView检测当前选定的项

    更新

    使用CollectionView检测当前选定项

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

    请记住,还要设置IsSynchronizedWithCurrentItem=“true”