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}"/>