简化WPF MVVM模式中集合更新的实用类

在图形用户界面(GUI)编程中,处理列表项的选择、属性修改、重新排序或从一个列表复制/移动到另一个列表,是一些非常常见的任务。假设正在使用WPFMVVM模式,那么如何实现这些功能呢?本文将介绍两个实用的类:NotifyParentObservableCollection和LookupItem,它们可以帮助简化这些任务的实现。

WPF应用程序中,经常需要在视图模型(ViewModel)中创建持有列表或集合的属性,并将它们绑定到视图(View)中的一些ItemsControl上。例如,可能想要切换Hex变量的各个位,就像下面这样:

<ListBox ItemsSource="{Binding Selectors}"> <ListBox.ItemTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsSelected}" Content="{Binding Caption}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox>

ViewModel的实现也可以非常简单:

private NotifyParentObservableCollection<LookupItem> _selectors; public NotifyParentObservableCollection<LookupItem> Selectors { get { return _selectors; } private set { if (_selectors != null) { _selectors.ChildPropertyChanged -= OnSelectorsChildPropertyChanged; } _selectors = value; if (_selectors != null) { _selectors.ChildPropertyChanged += OnSelectorsChildPropertyChanged; } OnPropertyChanged("Selectors"); } } private void OnSelectorsChildPropertyChanged(object sender, PropertyChangedEventArgs e) { var item = sender as LookupItem; if (e.PropertyName == "IsSelected") { if (item.IsSelected) { Hex |= (int)item.Value; } else { Hex &= ~(int)item.Value; } } } Selectors = new NotifyParentObservableCollection<LookupItem> { new LookupItem { Value = 1, Caption = "0x00000001" }, new LookupItem { Value = 2, Caption = "0x00000010" }, new LookupItem { Value = 4, Caption = "0x00000100" }, new LookupItem { Value = 8, Caption = "0x00001000" }, };

通过这种方式,完成了任务,并且代码非常简洁。

NotifyParentObservableCollection和LookupItem

LookupItem是一个通用的ViewModel类,用于需要更新/选择/排列/移动这些项的场景。它实现了INotifyPropertyChanged接口,以便在其属性发生变化时通知其父NotifyParentObservableCollection。如果需要更多的属性,可以继承它并添加需要的属性。

public class LookupItem : INotifyPropertyChanged { // 实现INotifyPropertyChanged接口 }

NotifyParentObservableCollection是ObservableCollection的扩展,它附加到其子项的PropertyChanged事件,并相应地引发ChildPropertyChanged事件。它继承自ObservableCollection,并重写了OnCollectionChanged()和ClearItems()方法,以便附加/分离处理程序到子项。

public classNotifyParentObservableCollection<T> : ObservableCollection<T> { // 重写方法以附加/分离事件处理程序 }

使用这些类,更新、选择、排列或移动项的任务变得非常简单。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485