Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 依赖于其他属性的自定义属性_Wpf_Binding_Properties_Dependency Properties - Fatal编程技术网

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

Wpf 依赖于其他属性的自定义属性,wpf,binding,properties,dependency-properties,Wpf,Binding,Properties,Dependency Properties,对事件风格的解释提前道歉;我觉得有很多因素都有各自的作用。WPF不是我选择的本机框架,它可能会显示: 旧情况:我有一个有几个控件的窗口。根据他们的选择,我使用多绑定和转换器来确定是否需要显示某些控件,在用户最终通过OK确认更改之前通知用户更改的含义(或者使用Cancel取消)。这很有效 问题:随着时间的推移,控制太多,太混乱。 解决方案:将内容放在不同的页面中,以便更容易地浏览用户。为了在用户在页面之间任意浏览时保持更改,我动态创建这些更改,并将它们放在缓存中(字典,请参见下文),用户选择时将从

对事件风格的解释提前道歉;我觉得有很多因素都有各自的作用。WPF不是我选择的本机框架,它可能会显示:

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

问题:随着时间的推移,控制太多,太混乱。 解决方案:将内容放在不同的页面中,以便更容易地浏览用户。为了在用户在页面之间任意浏览时保持更改,我动态创建这些更改,并将它们放在缓存中(
字典
,请参见下文),用户选择时将从缓存中提取这些更改

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

解决方案?我在中放置了一个
BasePage
类,该类公开某些抽象只读属性,这些属性定义了窗口执行通知所需了解的各个方面。例如,bool
requiresReboot
属性定义该页面上的当前状态是否需要重新启动才能生效(完全)。特定页面基于其控件实现该属性。 问题:我不知道如何创建一个适当的绑定,该绑定会随着页面的更改而正确更新。我尝试使用检查所有页面和相关属性的转换器将通知控件绑定到
字典

问题:

1) 如何为此目的创建适当的属性?我想我需要一个
dependancProperty
,因为我在MSDN上读了不少书,但我不知道这是如何结合在一起的。 2) 如何在自定义属性之间建立链接,以便允许页面上的(多个)控件更改该属性?我是否以某种方式使用INotifyPropertyChanged?我的旧示例与XAML中的几个
CheckBox.IsChecked
属性绑定。我试图避免在控件上放置大量事件(OnChange等),因为原始代码不需要它,而且我被告知,就WPF而言,它会导致一个混乱的解决方案。 3) 最后,我怀疑我可能需要将我的
Dictionary
类更改为实现某种
INotifyPropertyChanged
的自定义实现,但是对于集合?我相信,可观察的收集是我正在寻找的术语


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

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

  • 我最终在基类中将有问题的属性设置为非抽象的
    依赖属性
    ;这是我能够正确地将更改通知委托给接口的唯一方法。派生类最终只是将其绑定到它们的控件上(如果需要额外的逻辑,则使用适当的
    转换器)

  • 由于
    Dictionary
    不支持任何类型的更改通知,我额外收集了
    observedcollection
    ,用于绑定目的

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

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