WPF用户控件中的数据绑定

我正在为几个窗口共享的一系列控件创建一个UserControl。控件之一是标签,它以“协议编号”显示其他流程的流程。

我试图为DataBinding提供此标签,以便当协议号变量更改时,窗口自动反映进程的状态。

这是用户控件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; }

}

这会将协议编号设置为零,而忽略了设置为编号的值。

我看过例子

回答:

如果查看输出窗口,则应该看到绑定异常。

您遇到的问题如下:在用户控件中,您将标签绑定到用户控件的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>

编辑:清除一些事情,如果您更改MainWindow中的绑定,您的usercontrol也将起作用。但是您必须使用RelativeSource绑定到MainWindow的DataContext。

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

以上是 WPF用户控件中的数据绑定 的全部内容, 来源链接: utcz.com/qa/424525.html

回到顶部