WPF 用户控件中的数据绑定 [英] Data Binding in WPF User Controls

查看:72
本文介绍了WPF 用户控件中的数据绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为多个窗口共享的一系列控件创建一个 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 用户控件中的数据绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆