【发布时间】:2011-09-21 15:32:19
【问题描述】:
我正在使用 WPF 和 Mvvm,我的 ListView 将其 ItemSource 绑定到 ICollectionView。如何处理选中项更改事件?
最初我将 DataGrid 的 ItemSource 绑定到同一个 ICollectionView 并设置集合的 CurrentChanged 事件。一切正常,但 ListView 并非如此。
【问题讨论】:
我正在使用 WPF 和 Mvvm,我的 ListView 将其 ItemSource 绑定到 ICollectionView。如何处理选中项更改事件?
最初我将 DataGrid 的 ItemSource 绑定到同一个 ICollectionView 并设置集合的 CurrentChanged 事件。一切正常,但 ListView 并非如此。
【问题讨论】:
正如 Thomas 所提到的,您所要做的就是将列表框的 SelectedItem 属性绑定到视图模型中的属性。为了清楚起见,这里有一个例子。
这是我的看法
<Grid x:Name="LayoutRoot" Background="White">
<ListView ItemsSource="{Binding Contacts}" SelectedItem="{Binding SelectedContact, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
这是我的 ViewModel
public class MainViewModel: ViewModelBase
{
ObservableCollection<ContactViewModel> contacts;
ContactViewModel selectedContact;
public ContactViewModel SelectedContact
{
get { return selectedContact; }
set {
selectedContact = value;
base.OnPropertyChanged("SelectedContact");
}
}
public ObservableCollection<ContactViewModel> Contacts
{
get { return contacts; }
set {
contacts = value;
base.OnPropertyChanged("Contacts");
}
}
}
每次您尝试更改列表框中的选择时,您都会进入 SelectedContact 的设置器。
set
{
contacts = value;
base.OnPropertyChanged("Contacts");
}
通过此操作,您将知道所选联系人已更改。
使用属性 SelectedContact,您还可以知道您的集合中的哪个项目被选中。
如果要实现多选,还可以将 ViewModel 中的 Collection 属性绑定到 ListView 的 SelectedItems 属性。
【讨论】:
只需将 ListView 的 SelectedItem 绑定到 ViewModel 的属性
【讨论】: