在 MVVM 中有两种方法可以将 a 的属性暴露Model
给View
from ViewModel
:或者通过将整个 Model 暴露给 View,或者通过在 ViewModel 中暴露 View 关心的单个属性。
这两种方法同样有效,尽管您经常使用哪种方法取决于具体情况。
在您的情况下,您必须使用并非旨在通知 UI 更改的现有模型对象,我将使用在 ViewModel 中为视图创建属性的第二种方法。
例如,
<DataGrid ItemsSource="{Binding SelectedViper.Events}" />
public class ViperViewModel : INotifyPropertyChanged
{
private Viper _selectedViper;
public Viper SelectedViper
{
get { return _selectedViper; }
set
{
if (value != _selectedViper)
{
_selectedViper= value;
RaisePropertyChanged("SelectedViper");
}
}
}
}
会成为:
<DataGrid ItemsSource="{Binding ViperEvents}" />
public class ViperViewModel : INotifyPropertyChanged;
{
private Viper _selectedViper;
private ObservableCollection<Event> _viperEvents;
public ViperViewModel()
{
this.PropertyChanged += ViperViewModel_PropertyChanged;
}
void ViperViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "SelectedViper")
{
if (SelectedViper == null)
ViperEvents = null;
else
ViperEvents = new ObservableCollection<Event>(SelectedViper.Events);
}
}
public Viper SelectedViper
{
get { return _selectedViper; }
set
{
if (value != _selectedViper)
{
_selectedViper= value;
RaisePropertyChanged("SelectedViper");
}
}
}
public ObservableCollection<Event> ViperEvents
{
get { return _viperEvents; }
set
{
if (value != _viperEvents)
{
_viperEvents = value;
RaisePropertyChanged("ViperEvents");
}
}
}
}
前面的工作要多一些,但它使维护变得更加简单
作为替代方案,您可以覆盖ObservableCollection
该类并实现List<T>
您感兴趣的方法。例如,我有一个ObservableCollectionEx
当前实现Contains
、IndexOf
、AddRange
和的类RemoveRange
。如果您有兴趣,这里Sort
有一个方法示例。
当然,这也意味着您可能必须更新使用该属性的所有其他内容以使用 anObservableCollectionEx<T>
而不是 aList<T>