自定义属性取决于其他属性

时间:2011-06-07 09:06:23

标签: wpf binding properties dependency-properties

对事件风格的解释道歉;我认为所有因素都有自己的作用。 WPF不是我选择的原生框架,它可能会显示出来。 :)

旧情况:我有一个带有几个控件的窗口。根据他们的选择,我使用了多重绑定和转换器来确定是否需要显示某些控件,以便在用户最终通过确认(或简单地使用取消)解除之前通知用户更改的含义。这非常有效。

问题:随着时间的推移控制太多,太杂乱了。 解决方案:将内容放在不同的页面中,以便更容易浏览用户。为了让用户在页面之间任意浏览时保持更改,我会动态创建它们并将它们放在缓存中(Dictionary<string, BasePage>,见下文),用户可以从中选择它们。它们。

结果:我需要将绑定解耦到通知控件,因为不同的选项现在位于不同的页面上。

解决方案?我放了一个BasePage类,它暴露了某些抽象的只读属性,这些属性定义了窗口需要知道的各个方面才能进行通知。例如,bool requiresReboot属性定义该页面上的当前状态是否需要重新启动才能获得(完全)效果。特定页面根据其控件实现该属性。 问题:我不知道如何保持创建一个正确的绑定,以便在页面更改时正确更新。我尝试使用转换器为我的通知控件绑定Dictionary<string, BasePage>,该转换器检查所有页面和相关属性。

问题:

1)如何为此目的创建适当的属性?我认为我需要一个DependancyProperty,因为我在MSDN上做了相当多的阅读,但我无法弄清楚它是如何组合在一起的。 2)如何在我的自定义属性之间建立链接,以便它允许页面上的(多个)控件更改该属性?我是否以某种方式使用INotifyPropertyChanged?我的旧示例绑定了XAML中的几个CheckBox.IsChecked属性。我试图避免在控件上放置大量事件(OnChange等),因为原始代码不需要它而且我被告知它为WPF提供了一个混乱的解决方案。 3)最后,我怀疑我可能需要将我的Dictionary<string, BasePage>类更改为实现某种INotifyPropertyChanged但是对于集合的自定义实现?我相信Observable Collection是我要找的术语。

我希望有人能够弥合我对WPF(财产)内部理解的差距;我非常感激。一个基本的样本会更好,但如果它太复杂,只需向正确的方向轻推即可。谢谢。 :)

1 个答案:

答案 0 :(得分:1)

自从我解决这个问题已经有一段时间了,虽然我不记得问题的确切原因,但是有一些不同的问题构成了我遇到的大部分麻烦。

  1. 我最终使有问题的财产成为基类中的非抽象DependencyProperty;这是我可以正确地将更改通知委托给界面的唯一方法。派生类只是最终将它绑定到它们的控件(如果需要额外的逻辑,则使用适当的Converter。)

  2. 由于Dictionary<string, BasePage>不支持任何类型的更改通知,因此我制作了一个额外的ObservableCollection<BasePage>集合,用于绑定目的。

  3. 但是,当其中的项目更改了属性时,此类集合不会传播更改事件。由于这种情况需要,并且我在一个没有Master&lt; - &gt; Detail关系的属性的上下文中绑定到集合本身,如DataGrid(基本上添加了自己的OnPropertyChanged对绑定对象的处理程序),我最终继承了VeryObservableCollecton<>。这个监听它自己的项目,并抛出一个正确的更改事件(我认为它是来自OnPropertyChanged接口的INotifyPropertyChanged),以便绑定(或在这种情况下是多绑定)将刷新正确并允许我的界面更新。

  4. 它不是最漂亮的代码,感觉过度设计,但至少它允许我以这种方式将UI正确地绑定到数据。