【问题标题】:WPF Bind User Control property not workingWPF 绑定用户控件属性不起作用
【发布时间】:2026-01-02 11:45:01
【问题描述】:

我有一个用户控件,我试图绑定它的一个属性

用户控制 Xaml

<UserControl x:Class="pi_browser.Testing.Example"
             ...
             x: Name="LabelControl">
    <StackPanel x:Name="RootStackPanel">
        <Label Content="{Binding Text, ElementName=LabelControl}"/>
    </StackPanel>
</UserControl>

用户控制代码隐藏

public partial class Example : UserControl
{
    public Example()
    {
        InitializeComponent();
        ExampleViewModel vm = new ExampleViewModel(State);
        DataContext = vm;
    }

    public Boolean State
    {
        get { return (Boolean)this.GetValue(StateProperty); }
        set { this.SetValue(StateProperty, value); }
    }
    public static readonly DependencyProperty StateProperty = 
        DependencyProperty.Register("State", 
            typeof(Boolean), typeof(Example), new PropertyMetadata(false));
}

主页视图模型

class ExampleViewModel
{
    public ExampleViewModel(bool v)
    {
        val = v;
    }

    bool val;

    public string Text { get => val ? "This worked" : "This didnt work"; }
}

主窗口 Xaml

<Window x:Class="pi_browser.Testing.Tester" ... >
    <Grid>
        <local:Example State="True"/>
    </Grid>
</Window>

在这个例子中,我没有绑定 State 变量,我只传递了一个文字,但理想情况下我想绑定到实际值。

【问题讨论】:

    标签: c# wpf xaml data-binding


    【解决方案1】:

    State 是一个布尔值,但你绑定到 Text。让我们通过在您的用户控件上创建一个依赖属性Text 来解决一个问题。我们将修复Text 问题,而不是布尔State 问题。解决此问题后,对 State 执行相同操作。

    所以要修复Text,我们需要修复失败的原因:

     <Label Content="{Binding Text, ElementName=LabelControl}"/>
    

    您将 ElementName 设置为 UserControl 本身,这正是人们想要的。但是然后你告诉绑定寻找(记住绑定只是对象的反映)属性Text。该实例/类上的属性Text 不存在...但State 存在。很明显,绑定到新创建的Text 依赖属性用户控件来解决第一个问题。


    然后,当您在主页上实例化控件时,您需要然后绑定到 Text,因为该属性驻留在您的视图模型中。

    所以三件事,以及 UserControl 上提到的更改

    1. 使您的 ViewModel 遵循 INotifyPropertyChanged 并使 Text 属性使用您安装的通知机制。
    2. 确保您的主页将其 DataContext 设置为 ViewModel 类的有效实例
    3. 绑定到Text,例如&lt;local:Example State="{Binding Text}"/&gt;

    完成后,Text 值将正确地流向 UserControl。

    【讨论】:

    • 还要注意,UserControl 的构造函数中的DataContext = vm; 将有效地破坏其属性的任何基于DataContext 的绑定。例如。 &lt;local:Example State="{Binding SomeBooleanViewModelProperty}"/&gt; 将无法按预期工作。公开可绑定属性的 UserControl 不得显式设置自己的 DataContext。