数据在WPF用户控件绑定数据在WPF用户控件绑定(Data Binding in WPF User

2019-06-14 07:05发布

我创建了一系列由几个窗口共享控制一个用户控件。 其中一个控件是一个标志,显示了一些其它过程的“协议号”方面的流动。

我想提供数据绑定这个标签,这样的窗口会自动反映过程为协议数量变量的变化的状态。

这是用户控制的XAML:

<UserControl Name="MainOptionsPanel"
    x:Class="ExperienceMainControls.MainControls"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    >
<Label Height="Auto" Name="numberLabel">Protocol:</Label>
<Label Content="{Binding Path=ProtocolNumber}" Name="protocolNumberLabel"/>
(...)
</UserControl>

这是代码隐藏:

public partial class MainControls 
{
    public MainControls()
    {
        InitializeComponent();
    }

    public int ProtocolNumber
    {
        get { return (int)GetValue(ProtocolNumberProperty); }
        set { SetValue(ProtocolNumberProperty, value); }
    }

    public static DependencyProperty ProtocolNumberProperty = 
       DependencyProperty.Register("ProtocolNumber", typeof(int), typeof(MainControls));
}

这似乎是工作,因为如果在构造函数中我设置ProtocolNumber为任意值,它反映在用户的控制。

然而,最终的窗口中使用这个用户控件时,数据绑定符。

XAML:

<Window x:Class="UserControlTesting.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:expControl="clr-namespace:ExperienceMainControls;assembly=ExperienceMainControls"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    >
    <StackPanel>
        <expControl:MainControls ProtocolNumber="{Binding Path=Number, Mode=TwoWay}" />
    </StackPanel>

</Window>

代码隐藏窗口:

public partial class Window1 : Window
{
    public Window1()
    {
        Number= 15;
        InitializeComponent();
    }

    public int Number { get; set; }
}

这台协议编号为零,忽略设置数的值。

我读过例子

Answer 1:

如果你看一下你的输出窗口中,您应该看到绑定例外。

你的问题是:你的用户控件中,您将绑定标签,您UserControl的DP ProtocolNumber,而不是DataContext ,所以你必须元素名称添加到例如结合。

<UserControl Name="MainOptionsPanel"
    x:Class="ExperienceMainControls.MainControls"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="uc"
    >
<Label Height="Auto" Name="numberLabel">Protocol:</Label>
<Label Content="{Binding Path=ProtocolNumber, ElementName=uc}" Name="protocolNumberLabel"/>
(...)
</UserControl>

编辑:清理一些东西,如果你改变你的主窗口绑定你的用户控件也有效。 但你必须绑定与该的RelativeSource的主窗口在DataContext。

    <expControl:MainControls ProtocolNumber="{Binding Path=Number, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />


Answer 2:

你有什么有效:

<expControl:MainControls DataContext="{Binding RelativeSource={RelativeSource Self}}"
                         ProtocolNumber="{Binding Path=Number, Mode=TwoWay}"/>

=> 不要设置DataContextUserControl的声明,使用RelativeSourceElementName绑定来代替。



Answer 3:

如果你没有指定RelativeSource绑定的,尽量设置DataContext在构造函数:

    public Window1()
    {
        Number= 15;
        DataContext = this;
        InitializeComponent();
    }


文章来源: Data Binding in WPF User Controls