保持嵌套集合同步

时间:2018-01-28 14:52:06

标签: c# .net wpf mvvm

我正在处理一个小型WPF应用程序,我遇到了一些麻烦,使我的模型和视图模型保持同步。基本上,这些模型实现了自包含的业务逻辑,根据需要更新它们所拥有的集合,我需要一些方法或方法将这些更改传播到视图模型。

在阅读了一些类似的问题like this one之后,我设法实现了一个能够完成工作的简单模式,但在可维护性方面似乎相当低效,感觉更像是一种解决方法,而不是实际解决方案。

下面是我目前所用课程的简化示例:

包含数据和一些简单逻辑的基本样本类

public class FileHash
{
    public long Length { get; set; }
    public string Name { get; set; }
    public DateTime CreationTime { get; set; }
    public string Checksum { get; set; }
}

一个包含多种类型的集合和业务逻辑的类来管理这些类

public class FileIndex : INotifyPropertyChanged
{
    public Dictionary<string, FileHash> Hashes { get; private set; } // Hashes is 

    public void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    public UpdateFiles()
    {
        // Perform some logic to add/remove elements to the Hashes collections
        // or modify some of its elements 
        NotifyPropertyChanged("Hashes");
    }
}

表示FileIndex模型的viewmodel,其中包含在模型和视图之间进行通信的应用程序逻辑

class FileIndexViewModel : ViewModelBase.ViewModelBase
{       
    private FileIndex index;

    private ObservableCollection<FileHashViewModel> hashes;
    public ObservableCollection<FileHashViewModel> Hashes;
    {
        get { return hashes; }
        set
        {
            if (value != hashes)
            {
                hashes = value;
                OnPropertyChanged("");
            }
        }
    }

    public FileIndexViewModel(FileIndex index)
    {
        this.BackupSets = new ObservableCollection<FileHashViewModel>();
        UpdateBackupSets();

        index.PropertyChanged += new PropertyChangedEventHandler(Index_PropertyChanged);
    }


    private void Index_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if(e.PropertyName == "Hashes")
        {
            UpdateHashCollection();
        }
    }

    public UpdateHashCollection()
    {
        // Iterate through the Hashes collection of the current viewmodel
        // and its related FileIndex instance to update the local observable collection
    }

    public UpdateFiles()
    {
        // This would be called from the view, initiating an update in the model
        index.UpdateFiles();
    }
}

我基本上在模型中实现了INotifyPropertyChanged,订阅了viewmodel中的事件并相应地更新了集合。

我遇到的问题是,我需要在每次更改后列举两个集合中的每个项目。考虑到某些模型类具有嵌套集合,这可以级联到相当多的循环。 最明显的是,对整个集合运行更新操作,每个元素需要0.5到3秒。我想在UI中呈现每个元素的实时状态,这意味着我必须每隔几秒检查几千个元素以找出哪个元素被更改。

由于视图模型对正确显示数据实施了一些额外的修改,我也不能直接传递模型类的集合(至少不是所有类的集合)。

此外,我需要在每次修改模型时手动触发正确的事件。目前,这不是什么大问题,因为我只有几种修改元素的方法,但它在可伸缩性和容易出错方面并不理想。

有人知道如何改善这种模式吗?

0 个答案:

没有答案