自定义属性依赖于其他属性



对事件风格的解释表示歉意;我觉得有很多因素都有自己的作用。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的自定义实现,但对于Collections?我相信,可观收藏是我正在寻找的术语。

我希望有人能够弥合我对WPF(属性)内部理解的差距;我非常感谢。一个基本的样品会更好,但如果它太复杂,只要朝着正确的方向轻轻推一下就可以了。谢谢。:)

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

  1. 我最终在基类中使有问题的属性成为一个非抽象的DependencyProperty;这是我可以正确地将更改通知委托给接口的唯一方法。派生类最终只是将它绑定到它们的控件(在需要额外逻辑的情况下,使用适当的Converter)。

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

  3. 但是,当集合中的项的属性发生更改时,这样的集合不会传播更改事件。由于这种情况需要这样做,并且我在一个没有Master<->的属性的上下文中绑定到集合本身像DataGrid这样的细节关系(基本上是将自己的OnPropertyChanged处理程序添加到绑定对象中),我最终将VeryObservableCollecton<>子类化。这个侦听它自己的项,并抛出一个适当的更改事件(我认为它是来自INotifyPropertyChanged接口的OnPropertyChanged),以便绑定(或者在本例中是多绑定)正确刷新并允许我的接口更新。

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

最新更新