wpf - 具有 MVVM 实现的 WPF 应用程序的不可变数据模型

标签 wpf mvvm immutability

我有一个应用程序,它有一个数据树作为数据后端。为了实现 MVVM 模式,我有一个封装数据树的类逻辑层。因此逻辑也被安排在一棵树中。如果输入处于有效状态,则应将数据复制到第二个线程,该线程用作最后一个有效状态的双缓冲区。因此,一种方法是克隆。

另一种方法是将完整的数据后端实现为不可变的。这意味着如果输入新内容,将重建整个数据树。我的问题是,有没有一种实用的方法可以做到这一点?我被困在必须将数据树有效地重新分配给逻辑层的地步。

**更新 - 一些代码

我们正在做的是抽象我们用来运行实验的硬件设备。因此,我们定义了“机箱、序列、卡、 channel 、步骤”等类。那些构建了一个像这样的树结构:

                            Chassis
                          /      \
                   Sequence1      Sequence2
                   /    |    \
              Card1   Card2  Card3
             /     \
     Channel1      Channel2
    /        \
Step1        Step2

在代码中它看起来像这样:

public class Chassis{

readonly var List<Sequence> Sequences = new List<Sequence>();

}

public class Sequence{

readonly var List<Card> Cards = new List<Card>();

}

等等。当然,每个类都有更多的属性,但这些属性很容易处理。我现在的问题是 List 是一个可变对象。我可以调用 List.Add() 并且它发生了变化。好的,有一个 ReadOnlyList,但我不确定它是否以正确的方式实现不变性。就像按值复制一样,而不是引用,而不仅仅是通过阻止设置方法来阻止写入它。 下一个问题是序列和步骤的数量可能会有所不同。出于这个原因,我需要列表元素的原子交换。 目前我没有更多的代码,因为我仍在考虑这种方式是否对我有帮助,以及是否有可能在合理的时间内实现它。

最佳答案

注意有新的immutable collections for .NET这可以帮助您实现目标。

对 Dave Turvey 的声明要非常谨慎(如果可以的话,我会投反对票/发表评论):

If you are looking to implement an immutable list you could try storing the list as a private member but exposing a public IEnumerable<>

这是不正确的。私有(private)成员仍然可以通过其容器类进行更改。公共(public)成员可以转换为 List<T> , IList<T> , 或 ICollection<T>不抛出异常。因此任何依赖于公众不变性的东西IEnumerable<T>可能会破裂。

关于wpf - 具有 MVVM 实现的 WPF 应用程序的不可变数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13262631/

相关文章:

WPF MVVM : How to load views "on demand" without using plug-in architecture?

javascript - ...state, { } 和 Object.assign({ }, state, { }) 之间的区别

没有不可变对象(immutable对象)的推送 Angular 变化检测策略

f# - 是否可以在不放弃不变性的情况下更新 RavenDB 中的 F# 实体?

wpf - 如何跟踪所有消息

c# - Windows Mobile 6.5 现代 GUI 开发

c# - 如何在 Rectangle C# WPF 中添加文本作为内容

wpf - 通过DataTrigger设置的TextBox的Text不更新Model中的属性值

wpf - MVVM + WPF + Popup = 无能为力

WPF ListBox 在使用 ICommand 删除后选择下一项