首页 > 解决方案 > WPF 绑定用户控件属性不起作用

问题描述

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

用户控制 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#wpfxamldata-binding

解决方案


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诸如<local:Example State="{Binding Text}"/>

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


推荐阅读