C# 如何绑定到WPF中属性的属性? 什么有效
我有一个窗口,有一个小部件和这样的绑定:C# 如何绑定到WPF中属性的属性? 什么有效,c#,wpf,C#,Wpf,我有一个窗口,有一个小部件和这样的绑定: <Button Name="button" IsEnabled="{Binding Path=CanBeEnabled}"/> 属性控制器的形式非常简单,因为在窗口的生命周期内,它从不更改 什么不起作用 我希望有一个数据上下文并使用嵌套绑定,例如: <Button Name="button" IsEnabled="{Binding Path=controller.C
<Button Name="button" IsEnabled="{Binding Path=CanBeEnabled}"/>
属性控制器的形式非常简单,因为在窗口的生命周期内,它从不更改
什么不起作用
我希望有一个数据上下文并使用嵌套绑定,例如:
<Button Name="button" IsEnabled="{Binding Path=controller.CanBeEnabled}"/>
在这种情况下,小部件始终处于禁用状态
而且变化很小
在这种情况下,小部件始终处于启用状态,这不是输入错误
问题
如何使第二个表单工作?我更喜欢第二种形式,因为这样我就可以绑定到各种源,而不仅仅是从一个数据上下文
解决了的
Tom一针见血-问题是因为嵌套-按钮是自定义控件的一部分,我设置了两次数据上下文。定义控件时一次,像这里一样使用它时第二次。这就是为什么WPF会感到困惑的原因——我花了两天时间跟踪这个问题,哦,伙计:-你可以做得更简单,因为DataContext属性是继承的少数属性之一,这意味着当在树中某个元素上设置时,如果不重写它,所有子元素都会隐式地获得它 因此,您的windows代码可能类似于:
public WorkflowWindow(Controller con)
{
InitializeComponent();
DataContext = con;
}
然后你的按钮应该是这样的:
<Button IsEnabled="{Binding Path=CanBeEnabled}"/>
那么,当wpf的绑定引擎尝试解析CanBeEnabled属性时会发生什么情况:
它将查看按钮的DataContext。
按钮的DataContext未显式设置,但从按钮所在的窗口WorkflowWindow继承。
wpf将从DataContext获取CanBeEnabled属性,该属性被分配为传递给窗口的contstructor控制器。
按钮的DataContext是在他父母身上发现的第一个。。。在您的情况下,您可能有一个具有不同DataContext BindeTom的家长,您可以发布常规答案吗?我将设定为答案-感谢您的解释,但这种方法与我的第一个示例类似,但灵活性较低-当您喜欢绑定到多个源时,现在可能会遇到麻烦,因为您将数据上下文设置为整个窗口的极低级别。嗯,它的灵活性并没有降低,因为您可以将这些多个源放入控制器并通过它绑定。按照您的方式,您必须在视图中编写代码,该视图可以放在控制器中,我认为应该放在那里=进行一点测试,然后-添加另一个按钮并将其绑定到controller2。您将更改绑定的方式,或者您的代码将开始看起来非常奇怪。
public WorkflowWindow(Controller con)
{
controller = con;
InitializeComponent();
DataContext = this;
button.DataContext = this; // directly setting the data context
}
public WorkflowWindow(Controller con)
{
InitializeComponent();
DataContext = con;
}
<Button IsEnabled="{Binding Path=CanBeEnabled}"/>