- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有我的 MVVM,模型由许多相关的类组成,但为了这个问题,我们只关注四个。
GrandParentModel、ParentModel、ChildModel 和联系人。
这些都继承自 ModelBase,它有一个 INotifyPropertyChanged 的实现。
所以这三个模型中的每一个都有一个 Contact 属性。如果 Child 没有属性,则应该查找 Parent,如果 Parent 为空,则查找 GrandParent。如果祖 parent 级别的联系人发生变化,我希望任何受抚养人,即任何子 parent 及其子女也为他们的联系人提出 PropertyChanged 事件。
我认为我要做的所有事情都将得到 DependencyProperty 系统的支持,但我不想使用它,因为这是我的模型、关注点分离等等。所以我正在整理一个迷你实现,这一切都很好。
我的问题是以前有没有人走这条路,将来有什么我应该担心的吗?我的蜘蛛侠感觉刺痛,我不知道为什么。
谢谢
伊恩
编辑:这里的对象之间的关系是祖 parent 有任意数量的 parent 有任意数量的 child 。我当前的模型在每个模型上都有一个指向父对象的属性(在祖 parent 的情况下为 null),并且父/祖 parent 具有一组子对象。
最佳答案
我一直在这条路上,它并不漂亮。基本上你必须订阅 PropertyChanged
ParentModel
的事件来自您的ChildModel
.如果您的 child 可以更换 parent ,您必须小心。那么当你从 child 的角度收到 parent 发生变化的通知时,你必须提出自己的PropertyChanged
关于 child 的事件。它变得丑陋,因为您最终可能会挂起忘记清理的事件处理程序。
更好的方法是创建自己的模型特定模拟到 DependencyProperty
.基本上在 ChildModel
的构造函数中您“声明”该属性 Contact
属性(property)代表Contact
对象 Parent
为空时。你可以使用一个观察 PropertyChanged
的小助手类来做到这一点。 ParentModel
上的事件对象并让它执行 PropertyChanged
在适当的时候发生在 child 身上。也让它注意Parent
属性改变在 child 身上。
您可以使用 MVVM Light 消息总线。让祖 parent 和 parent 在他们的 Contact
时都发送消息属性变化。让 child 听那些信息。当它收到一条消息时,检查它是否匹配它自己的 parent 或祖 parent ,并提出 PropertyChanged
必要时事件。这比上述任何一种方法都好,因为您不必跟踪 parent 或祖 parent 何时发生变化。你不太可能有错误。它还使用弱引用,因此它不会像事件处理程序那样持有对象。
现在我一直在做的是远离让我的模型对象实现 INotifyPropertyChanged
.我介绍了一个Presenter
我的模型和我的 ViewModel 之间的层。 Presenter
实际上是从小的 ViewModel“小部件”(例如,一个小部件可能是 ChangeValue<T>
小部件)构造一个 ViewModel。我有一个规则引擎告诉 Presenter
如何用给定模型的小部件组成 ViewModel。 Presenter
处理所有用户输入(基本上对模型执行 lambda),但由于它知道用户操作刚刚发生,它知道模型中的某些内容可能已经改变。模型操作完成后,它将所有数据从模型复制到 View 模型。 ViewModel 检查传入的数据并引发 PropertyChanged
如果字段实际更改,则事件。显然这是最复杂的方式,但它为您提供了一个非常干净的模型,并且 ViewModel 和 Presenter 都不包含任何模型(域/业务)逻辑。
关于mvvm - WPF MVVM 模型的 DependencyProperty 类似物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4668239/
我有一个包含只读 DependencyProperty 的类。从这个类中,我想绑定(bind)到只读 DependencyProperty到另一个只读 DepenendencyProperty另一个类
我有一个带有 ComboBox 的控件: 这是PropertyChangedCallback为属性(property) SelectedTrace在包含 ComboBox 的 OuterContro
我是 WPF/MVVM 的新手,我发现的示例似乎没有涵盖我面临的问题。 我有一个用于管理相当复杂的业务配置对象的屏幕。在 MVVM 中,我认为这意味着我应该具有以下内容: 具有接近于零逻辑的 XAML
我正在探索 WPF 世界,我在网上找到了一个关于如何在 xml 上使用绑定(bind)的好例子 http://www.codeproject.com/Articles/37854/How-to-Per
我有一个自定义类 MyPerson。所有(相关)属性都实现 INotifyPropertyChanged。 我创建了一个 UserControl 来显示它,一切正常。绑定(bind)到 MyPerso
我试图在我的代码中使用 tis 依赖属性,但它给了我错误,说默认值类型与属性“MyProperty”的类型不匹配。 但 short 应该接受 0 作为默认值。 如果我尝试给它一个 null 作为默认值
我在我的用户控件中定义了这样的属性: public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty);
在我的用户控件中: public ODIF.DeviceChannel Channel { get { return (ODIF.DeviceChannel)GetValue(ChannelD
我在 WPF 应用程序的 ViewModel 中有这个简单的示例: class VM_DiskPartition : DependencyObject { // (...) Other
在previous post中我问如何将属性注册为 DependencyProperty。我得到了答案并且效果很好。 但现在我想在单击时向此 DependencyProperty 添加一些项目。这是行
我有两个对象绑定(bind)到同一个 dependencyProperty(在 Silverlight 中)。有没有办法确定这两个对象中的哪一个改变了属性?我想根据这些信息采取不同的行动。 不幸的是,
我正在将 XAML 序列化为文件并再次读取它(使用 XamlWriter 和 XamlReader)。 如果从未为元素设置 DependencyProperty(如 FrameworkElement
我有一个名为 ChartView 的用户控件。我有一个 ObservableCollection 类型的属性。我在 ChartView 中实现了 INotifyPropertyChanged。 Cha
虽然网络上的大多数代码示例都使用 DependencyProperties 的静态声明,但我发现在某些情况下它们被定义为公共(public)只读实例成员。 将 DependencyProperty 定
我有析构函数问题。这是重现问题的代码: class DPDemo : DependencyObject { public DPDemo() { } ~DPDemo()
在我的 XAML 中,我有一个带有 DependencyProperty 的对象: 我还有MouseUp处理程序 TextBlock .我如何获得 OverWidth属性值在里面? 最佳答案 这似乎
我正在创建一个模仿 AppBarButton 的自定义控件(但具有自定义功能,因此我们无法从 AppBarButton 派生)。 我的问题是 AppBarButton 的 Icon 属性。该属性本身采
如何将属性名称(字符串形式)转换为 DependencyProperty? 我有一组属性名称、它的字符串值和一个 DependencyObject。现在我想将这些属性值设置为 DependencyOb
我的控件有一个映射到私有(private)变量的属性。设置属性时,我还需要存储某个其他变量。当属性的私有(private)变量由我自己的控制代码设置时,一定不会出现这种特殊处理。一切顺利。 我现在需要
我正在尝试创建一个用户控件,其中包含一些 DependencyProperties,这些属性会转发给用户控件中的子控件。经过几次尝试,我开始工作了。为了测试一个小例子。 在示例中,我有一个名为 Ctr
我是一名优秀的程序员,十分优秀!