3

假设我有一个模型类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;}
}

然后我没有收到任何更新。(我知道这只是复制列表,我只是用它来表达观点)。如果我在该属性上使用 INotifyPropertyChanged,RandomData那么我只会收到分配给它的新列表的通知。我如何检查内容的更改?这样做的首选方法是什么?

感谢您的任何建议

4

3 回答 3

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

于 2013-03-21T08:53:58.223 回答
1

我相信要注意您想要使用 INotifyCollectionChanged 的​​现有集合中的更改。

http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx

实现这个接口可能是一个很好的使用方法。但是,我相信 MSDN 中的 MVVM 模型文章http://msdn.microsoft.com/en-us/magazine/dd419663.aspx中,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;
        }
于 2013-03-20T17:42:41.153 回答
0

选项 1(稍微远离 MVVM 但有效)。将此添加到您的 View 代码隐藏的 OnNagivatedTo 中,它将随时刷新数据:

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

选项 2:

 raise RaisePropertyChanged(YourItem);
于 2013-04-02T14:17:16.770 回答