gpt4 book ai didi

c# - WPF 用户控件中的数据绑定(bind)

转载 作者:IT王子 更新时间:2023-10-29 04:11:07 26 4
gpt4 key购买 nike

我正在为多个窗口共享的一系列控件创建一个 UserControl。其中一个控件是标签,它根据“协议(protocol)编号”显示其他一些流程的流程。

我正在尝试使用此标签提供 DataBinding,以便窗口在协议(protocol)号变量更改时自动反射(reflect)进程的状态。

这是用户控件 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 设置为任意值,它会反射(reflect)在用户控件中。

但是,当在最终窗口上使用此用户控件时,数据绑定(bind)会中断。​​

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; }
}

这会将协议(protocol)编号设置为零,忽略设置为数字的值。

我读过例子

最佳答案

如果您查看输出窗口,您应该会看到绑定(bind)异常。

您遇到的问题如下:在您的用户控件中,您会将标签绑定(bind)到用户控件的 DP ProtocolNumber 而不是 DataContext,因此您必须将元素名称添加到绑定(bind)。

<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>

编辑:为了清除一些东西,如果您更改主窗口中的绑定(bind),您的用户控件也可以工作。但您必须使用 RelativeSource 绑定(bind)到 MainWindow 的 DataContext。

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

关于c# - WPF 用户控件中的数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com