WPF用户控件属性未绑定或更新

时间:2019-03-09 04:17:00

标签: c# wpf

我正在弄乱WPF并创建用户控件,但是很难理解数据绑定应该如何工作。数据绑定似乎过于复杂,并且只要WPF失效,我认为MS会创建一些快捷方式来避免进行大量的样板代码。

用户控件xaml

<UserControl x:Class="WPFTest.FancyBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d">
   <DockPanel>
      <Label Content="{Binding MyText}"></Label>
   </DockPanel>
</UserControl>

用户控件.cs

public partial class FancyBox : UserControl
{
    public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register("MyText", typeof(string), typeof(FancyBox), new PropertyMetadata(null));

    public string MyText
    {
        get => (string)GetValue(MyTextProperty);
        set => SetValue(MyTextProperty, value);
    }

    public FancyBox()
    {
        InitializeComponent();
    }
}

在主窗口中的用法

<StackPanel>
    <local:FancyBox MyText="testing!"/>
</StackPanel>

2 个答案:

答案 0 :(得分:1)

绑定Content="{Binding MyText}"绑定到控件(Label)的DataContext,该控件从树的最接近祖先那里继承,该祖先拥有一个(您的代码未显示任何DataContext作业)

您的预期行为是让Label的内容绑定到User Control的属性,在这种情况下,您需要让用户控制您的源。例如,有很多方法可以做到这一点:

<UserControl x:Class="WPFTest.FancyBox"
x:Name="RootElement"
....
<Label Content="{Binding MyText, Source={x:Reference RootElement} />

或者另一种方式:

<Label Content="{Binding MyText, RelativeSource={RelativeSource FindAncestor,
    AncestorType={x:Type local:FancyBox}}" />

请记住,没有源(源,RelativeSource)的任何绑定都将来自DataContext

答案 1 :(得分:0)

我想我根本不需要数据绑定

我将控件标签更改为:

productid

和我后面的代码:

<Label x:Name="lblText"></Label>