【问题标题】:Custom property dependant on other properties依赖于其他属性的自定义属性
【发布时间】:2011-09-09 21:59:45
【问题描述】:

对于事件风格的解释提前道歉;我觉得有很多因素都在发挥自己的作用。 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 的自定义实现,但对于集合?我相信 Observable Collection 是我正在寻找的术语。

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

【问题讨论】:

    标签: wpf binding properties dependency-properties


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-16
      • 2010-11-15
      • 2016-07-08
      • 1970-01-01
      • 2019-12-17
      • 2017-02-08
      • 1970-01-01
      • 2011-08-20
      相关资源
      最近更新 更多