2013-03-20 48 views
3

假设我有一个模型类Data,并且我想为它创建DataViewModelDataView。数据类看起来是这样的:当Model List中的列表更改时,ObservableCollection不会更新模型

public class Data 
{ 
    public Data() 
    { 
     RandomData = new List<String>(); 
    } 

    public List<String> RandomData {get; set;} 
} 

我想创建DataViewModel封装RandomData财产。我需要绑定到某个ListView中的RandomData属性,并在底层模型的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,那么我只会收到分配给它的新列表的通知。我如何检查内容的改变?这样做的首选方式是什么?

谢谢你的任何建议

回答

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当然是只读的。

+0

是的,这是点亮的。似乎我别无选择,只能使用ObservableCollections。 – 2013-03-21 12:06:46

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; 
     } 
+0

那是一个错字或你的意思是我应该的数据的属性变更为的ObservableCollection?因为我根本无法改变模型。更确切地说,我可以改变它,但是没有其他方法可以做到这一点? – 2013-03-20 17:48:35

+0

我的歉意,我没有完全读你的问题。我相信你想要的接口是INotifyCollectionChanged,它可以让你知道集合何时添加和删除数据值以及属性。 http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx – djangojazz 2013-03-20 18:16:56

+0

看到我更新的答案,我误将属性更改收集更改。我知道在MSDN文章中,乔希史密斯通过暴露事件和会计来直接处理逻辑。我知道如果你下载这个例子,你可以看到客户实时添加到你的主要收藏中,以及完全不同的视图。 – djangojazz 2013-03-20 18:26:42

0

选项1(MVVM的一点点,但工程)。这OnNagivatedTo添加您查看的代码隐藏,它将刷新数据随时随地:

protected override void OnNavigatedTo(NavigationEventArgs e) { 
this.DataContext = new YourViewModel(); 
} 

选项2:

raise RaisePropertyChanged(YourItem); 
相关问题