从另一个帮助器类更新视图模型的可观察集合

时间:2013-10-08 23:34:36

标签: c# wpf mvvm viewmodel

我有一个带有ObservableCollection的ViewModel,我有一个很长的函数,我将用它来更新ObservableCollection项,但是函数太长了,我不想把它放在ViewModel中。

我想直接在ObservableCollection上进行更新,这样我就可以在进程运行时看到我视图上的更改。

我想到了关注

  • 通过ref发送ObservableCollection
  • 将当前项发送到函数并返回更新的 对象
  • 使我的ObservableCollection静态
  • 将更新功能放在我的ViewModel中,但这会使我的ViewModel变得庞大而凌乱

对于这个集合会有很多不同的功能,在这种情况下,什么是最好的编程实践?

1 个答案:

答案 0 :(得分:1)

如果您正在处理数据然后将处理过的数据传递给View,那么我认为以下选项应该是一种可能的解决方案。

以下解决方案将处理数据,同时还会同时向视图通知更改。

public class MyViewModel : INotifyPropertyChanged
{
    private ObservableCollection<string> _unprocessedData = new ObservableCollection<string>();
    private ObservableCollection<string> _processedData = new ObservableCollection<string>();
    private static object _lock = new object();
    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<string> Collection { get { return _processedData; } }//Bind the view to this property

    public MyViewModel()
    {
        //Populate the data in _unprocessedData
        BindingOperations.EnableCollectionSynchronization(_processedData, _lock); //this will ensure the data between the View and VM is not corrupted
        ProcessData();
    }

    private async void ProcessData()
    {
        foreach (var item in _unprocessedData)
        {
            string result = await Task.Run(() => DoSomething(item));
            _processedData.Add(result);
            //NotifyPropertyChanged Collection
        }
    }

    private string DoSomething(string item)
    {
        Thread.Sleep(1000);
        return item;
    }
}

可以在ViewModel之外的其他类中定义DoSomething方法。

我希望这会有所帮助。