C# 从另一个助手类更新视图模型的可观察集合

C# 从另一个助手类更新视图模型的可观察集合,c#,wpf,mvvm,viewmodel,C#,Wpf,Mvvm,Viewmodel,我有一个带有ObservableCollection的ViewModel,我有一个很长的函数,我将使用它来更新ObservableCollection项,但是这个函数太长了,我不想把它放在ViewModel中 我想直接在ObservaleCollection上进行更新,以便在进程运行时可以看到视图上的更改 我想到了下面的问题 通过ref发送ObservableCollection 将当前项发送到函数并返回更新的 反对 使我的可观察收集保持静态 在我的ViewModel中加入更新功能,但这会使我

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

我想直接在ObservaleCollection上进行更新,以便在进程运行时可以看到视图上的更改

我想到了下面的问题

  • 通过ref发送ObservableCollection
  • 将当前项发送到函数并返回更新的 反对
  • 使我的可观察收集保持静态
  • 在我的ViewModel中加入更新功能,但这会使我的ViewModel变得又大又乱

在这种情况下,什么是最佳编程实践?

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

下面的解决方案将处理数据,同时也会将更改通知视图

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;
    }
}
公共类MyViewModel:INotifyPropertyChanged
{
私有ObservableCollection_unprocessedData=新ObservableCollection();
私有ObservableCollection_processedData=新ObservableCollection();
私有静态对象_lock=新对象();
公共事件属性更改事件处理程序属性更改;
公共ObservableCollection集合{get{return}\u processedData;}}//将视图绑定到此属性
公共MyViewModel()
{
//在_unprocessedData中填充数据
BindingOperations.EnableCollectionSynchronization(_processedData,_lock);//这将确保视图和VM之间的数据没有损坏
ProcessData();
}
私有异步void ProcessData()
{
foreach(未处理数据中的var项)
{
字符串结果=等待任务。运行(()=>DoSomething(item));
_processedData.Add(结果);
//NotifyPropertyChanged集合
}
}
私有字符串DoSomething(字符串项)
{
睡眠(1000);
退货项目;
}
}
DoSomething方法可以在ViewModel之外的其他类中定义

我希望这有帮助