【问题标题】:Binding Label content to Self string field but no result将标签内容绑定到 Self 字符串字段但没有结果
【发布时间】:2010-09-02 01:00:33
【问题描述】:

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

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

底层代码为:

public partial class FlowNode : UserControl
{
    public FlowNode()
    {
        InitializeComponent();
    }

    public string Header { get { return "Testing"; } };
}

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

【问题讨论】:

    标签: c# .net wpf binding label


    【解决方案1】:

    {RelativeSource Self} 指的是Label 实例,而不是您的用户控件。

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

    【讨论】:

      【解决方案2】:

      尝试使用

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

      【讨论】:

      • 您还需要为定义FlowNode 的命名空间添加xmlns
      【解决方案3】:

      在您的构造函数中,将 UserControl 的 DataContext 设置为自身。 “this.DataContext = 这个”。并删除绑定中的 RelativeSource。

      【讨论】:

      • 你不应该在 UserControl 中这样做 - 这是一个错误的秘诀。当您将 DataContext 设置为自身时,您会通过覆盖继承的值来破坏在使用继承的 DataContext 的控件实例上设置的任何绑定。由于您是从内部执行此操作,因此无法从使用该控件的 XAML 中看到。而是在 UserControl 的 XAML 中设置命名元素的 DataContext,例如根 Grid。
      • 我绝对同意您关于“this.DataContext = this”的评论通常不是一个好的设计实践,我想我只是向 OP 建议这是修复他的最直接的方法基于他上面给出的事实的问题。 =)
      【解决方案4】:

      在我看来,在 xaml 中访问“我”/“这个”的最方便的方法是在您的控件上放置一个名称: 然后,如果您绑定到控件的属性或 dp,则使用 E​​lementName 语法。

      因此您不会破坏控件的 DataContext。

      RelativeSource FindAncestor 绑定可能有一种方法,但我看不出比那个方法有什么优势。

      但是不要将你的Control的DataContext设置为自身,否则它会失去对其DataContext的认识。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2010-12-07
        相关资源
        最近更新 更多