我正在处理一个小型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中呈现每个元素的实时状态,这意味着我必须每隔几秒检查几千个元素以找出哪个元素被更改。
由于视图模型对正确显示数据实施了一些额外的修改,我也不能直接传递模型类的集合(至少不是所有类的集合)。
此外,我需要在每次修改模型时手动触发正确的事件。目前,这不是什么大问题,因为我只有几种修改元素的方法,但它在可伸缩性和容易出错方面并不理想。
有人知道如何改善这种模式吗?