首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MVVM处理SelectedItem事件的最简单方法是什么?

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

Stack Overflow用户
提问于 2009-06-18 09:34:51
回答 2查看 17.8K关注 0票数 10

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

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

目前,我的基本MVVM模板中有DelegateCommandAttachedBehaviors,我可以使用它们,但是当"combobox选择一个新项“时,我想不出如何激发它们。

视图:

代码语言:javascript
复制
<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>

代码背后:

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-18 09:38:00

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

ViewModel:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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>
票数 12
EN

Stack Overflow用户

发布于 2009-06-18 09:38:56

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

更新

使用CollectionView检测当前选定项

代码语言:javascript
复制
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(Customers); 
view.CurrentChanged += delegate 
{ 
    SelectedCustomer= (Customer)view.CurrentItem; 
};

只需记住也要设置IsSynchronizedWithCurrentItem="True“

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1011750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档