问题描述
我正在为多个窗口共享的一系列控件创建一个 UserControl.其中一个控件是一个标签,它根据协议编号"显示了一些其他进程的流程.
I am creating a UserControl for a series of controls shared by several windows. One of the controls is a Label which shows the flow of some other process in terms of "protocol numbers".
我正在尝试使用此标签提供数据绑定,以便窗口在协议编号变量更改时自动反映进程状态.
I am trying to offer DataBinding with this Label so the Window automatically reflects the state of the process as the protocol number variable changes.
这是用户控件 XAML:
This is the User control 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 设置为任意值,它会反映在用户控件中.
This seems to be working because if on the constructor I set ProtocolNumber to an arbitrary value, it is reflected in the user control.
但是,在最终窗口上使用此用户控件时,数据绑定会中断.
However, when using this usercontrol on the final window, the data binding breaks.
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; }
}
这会将协议编号设置为零,忽略设置为编号的值.
This sets the Protocol Number to zero, ignoring the value set to Number.
我读过例子
推荐答案
如果您查看输出窗口,您应该会看到绑定异常.
if you look at your output window you should see the binding exception.
您遇到的问题如下:在您的用户控件中,您会将标签绑定到用户控件的 DP ProtocolNumber 而不是 DataContext
,因此您必须将例如元素名称添加到绑定.
The problem you have is the following: within your usercontrol you will bind the label to the DP ProtocolNumber of your usercontrol and not the DataContext
, so you have to add for example the element name to the binding.
<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 中的绑定,您的用户控件也可以工作.但是你必须使用RelativeSource绑定到MainWindow的DataContext.
to clear some things up, your usercontrol also works if you change the binding in your MainWindow. but you have to bind to the DataContext of the MainWindow with RelativeSource.
<expControl:MainControls ProtocolNumber="{Binding Path=Number, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
这篇关于WPF 用户控件中的数据绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!