WPF 绑定用户控件 属性 不工作

WPF Bind User Control property not working

我有一个用户控件,我正在尝试绑定其属性之一

用户控制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"; }
}

主要WindowXaml

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

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

State 是布尔值,但您绑定到 Text。让我们通过在您的用户控件上创建依赖项 属性 Text 来解决一个问题。我们将修复 Text 问题而不是布尔值 State 问题。一旦你解决了这个问题,对 State.

做同样的事情

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

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

您将 ElementName 设置为 UserControl 本身,这正是我们想要的。但是随后您告诉绑定查找(记住绑定只是对象在幕后的反射)属性 Text。 属性 Text 在 instance/class 上不存在 ...但是 State 存在。很明显绑定到新创建的 Text 依赖项 属性 在用户控件上 来解决第一个问题。


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

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

  1. 使您的 ViewModel 遵守 INotifyPropertyChanged 并使 Text 属性 使用您安装的通知机制。
  2. 确保您的主页的 DataContext 设置为您的 ViewModel class.
  3. 的有效 实例
  4. 绑定到 Text 例如 <local:Example State="{Binding Text}"/>

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