繁体   English   中英

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));
}

主页查看 Model

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

    bool val;

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

主Window Xaml

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

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

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

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

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

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


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

所以三件事,以及 UserControl 上提到的变化

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM