假设我有一个模型类Data
,我想为它创建DataViewModel
和DataView
。数据类如下所示:
public class Data
{
public Data()
{
RandomData = new List<String>();
}
public List<String> RandomData {get; set;}
}
我想创建封装DataViewModel
属性的RandomData
。我需要绑定到某些RandomData
中的ListView
属性,并在基础模型的RandomData
更改时更新。
如果我这样做:
public class DataViewModel
{
private Data _data;
public DataViewModel(Data data)
{
_data = data;
RandomData = new ObservableCollection<String>(_data.RandomData);
}
public ObservableCollection<String> RandomData {get; set;}
}
然后我没有收到任何更新。 (我知道这只是复制列表,我只是用它来解决问题)。如果我在RandomData
属性上使用了INotifyPropertyChanged,那么我只会收到分配给它的新列表的通知。如何检查内容的更改?这样做的首选方式是什么?
感谢您提出任何建议
答案 0 :(得分:3)
对于这个具体的例子,我很想改变你的模型以使用ObservableCollection
public class Data
{
public Data()
{
RandomData = new ObservableCollection<String>();
}
public ObservableCollection<String> RandomData {get; set;}
}
然后在您的视图模型中将其公开为ReadOnlyObservableCollection。请注意,ReadOnlyObservableCollection是原始ObservableCollection的包装器。不会复制数据,并且ReadOnlyObservableCollection会反映原始集合中的更改通知。
public class DataViewModel
{
public DataViewModel(Data data)
{
RandomData = new ReadOnlyObservableCollection<String>(data.RandomData);
}
public ReadOnlyObservableCollection<String> RandomData {get; private set;}
}
这假设您希望视图模型RandomData当然是只读的。
答案 1 :(得分:1)
我相信要注意您想要使用INotifyCollectionChanged的现有集合中的更改。
http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx
实现此接口可能是一种很好的使用方法。但是我相信MVVM模型文章http://msdn.microsoft.com/en-us/magazine/dd419663.aspx,在MSDN中,Josh Smith甚至没有使用这个界面。我知道在他给出的例子中,他将客户添加到一个类似于以下逻辑的集合中:
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null && e.NewItems.Count != 0)
foreach (CustomerViewModel custVM in e.NewItems)
custVM.PropertyChanged += this.OnCustomerViewModelPropertyChanged;
if (e.OldItems != null && e.OldItems.Count != 0)
foreach (CustomerViewModel custVM in e.OldItems)
custVM.PropertyChanged -= this.OnCustomerViewModelPropertyChanged;
}
答案 2 :(得分:0)
选项1(稍微偏离MVVM但有效)。将此添加到您的View代码隐藏的OnNagivatedTo,它将随时刷新数据:
protected override void OnNavigatedTo(NavigationEventArgs e) {
this.DataContext = new YourViewModel();
}
选项2:
raise RaisePropertyChanged(YourItem);