在图形用户界面(GUI)编程中,处理列表项的选择、属性修改、重新排序或从一个列表复制/移动到另一个列表,是一些非常常见的任务。假设正在使用WPF和MVVM模式,那么如何实现这些功能呢?本文将介绍两个实用的类: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" },
};
通过这种方式,完成了任务,并且代码非常简洁。
LookupItem是一个通用的ViewModel类,用于需要更新/选择/排列/移动这些项的场景。它实现了INotifyPropertyChanged接口,以便在其属性发生变化时通知其父NotifyParentObservableCollection。如果需要更多的属性,可以继承它并添加需要的属性。
public class LookupItem : INotifyPropertyChanged
{
// 实现INotifyPropertyChanged接口
}
NotifyParentObservableCollection
public classNotifyParentObservableCollection<T> : ObservableCollection<T>
{
// 重写方法以附加/分离事件处理程序
}
使用这些类,更新、选择、排列或移动项的任务变得非常简单。