C# 将标签内容绑定到自字符串字段,但没有结果

C# 将标签内容绑定到自字符串字段,但没有结果,c#,.net,wpf,binding,label,C#,.net,Wpf,Binding,Label,我正在尝试在我的用户控件中轻松绑定: <UserControl x:Class="MyApp.FlowNode" ...> <StackPanel> <Label Content="{Binding Path=Header, RelativeSource={RelativeSource Self}}" /> </StackPanel> </UserControl> 但是,标签保持空白。我做错了什么?在构

我正在尝试在我的用户控件中轻松绑定:

<UserControl x:Class="MyApp.FlowNode" ...>
    <StackPanel>
        <Label Content="{Binding Path=Header, RelativeSource={RelativeSource Self}}" />
    </StackPanel>
</UserControl>

但是,标签保持空白。我做错了什么?

在构造函数中,将UserControl的DataContext设置为自身。“this.DataContext=this”。并删除绑定中的相对资源。

{RelativeSource Self}
指的是
标签
实例,而不是用户控件

如karmicpuppet所建议的,您应该将UserControl的
DataContext
设置为自身,而不是使用
RelativeSource

尝试使用

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type FlowNode}}}.

在我看来,在xaml中访问“Me”/“this”最方便的方法是在控件上加一个名称: 然后,如果绑定到控件的属性或dp,则使用ElementName语法

这样就不会破坏控件的DataContext

可能有一种使用相对资源FindAncestor绑定的方法,但我看不出它有什么优势


但不要将控件的DataContext设置为自身,否则它将失去对其DataContext的意识。

在UserControl中永远不应该这样做-这会导致错误。将DataContext设置为自身时,可以通过重写继承的值来断开在使用继承的DataContext的控件实例上设置的任何绑定。因为您是从内部执行的,所以无法从使用控件的XAML中看到。相反,在UserControl的XAML中设置命名元素的DataContext,就像根网格一样。我完全同意你关于“this.DataContext=this”的评论,这通常不是一个好的设计实践,我想我只是建议OP,根据他上面给出的事实,这是解决问题的最直接的方法。=)您还需要为定义了
FlowNode
的命名空间添加
xmlns
{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type FlowNode}}}.