2011-06-07 62 views
0

事件式的解释进展道歉;我觉得有很多因素都起到了自己的作用。 WPF不是我选择的本地框架,它可能表明。 :)自定义属性取决于其他属性

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

问题:随着时间的流逝太多控制太多,太多混乱。 解决方案:将东西放入不同的页面,以便浏览用户变得更加容易。为了在用户在页面之间任意浏览时保留更改,我动态创建这些更改并将它们放入缓存(Dictionary<string, BasePage>,请参见下文),在用户选择它们时将从中缓存这些缓存。

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

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

问题:

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

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

回答

1

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

  1. 我最终使基本类中的非抽象DependencyProperty属性成为问题;这是我能够将更改通知正确委派给界面的唯一方法。派生类只是最终将其绑定到他们的控件(在需要额外逻辑的情况下,适当的Converter)。

  2. 由于Dictionary<string, BasePage>不支持任何形式的更改通知,我额外收集了用于绑定目的的ObservableCollection<BasePage>

  3. 但是,这样的集合不会在其内部的项目更改属性时传播更改事件。由于这种情况要求,并且我在一个没有主对象的情况下绑定到集合本身 - >详细关系像DataGrid(它基本上将它们自己的OnPropertyChanged处理程序添加到绑定对象),我结束了子类化VeryObservableCollecton<>。这个监听它自己的项目,并引发适当的更改事件(我认为它是来自INotifyPropertyChanged接口的OnPropertyChanged),以便绑定(或本例中为多重绑定)能够正确刷新并允许我的界面进行更新。

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