WPF 用户控件中的数据绑定

     2023-02-19     105

关键词:

【中文标题】WPF 用户控件中的数据绑定【英文标题】:Data Binding in WPF User Controls 【发布时间】:2022-01-05 22:42:54 【问题描述】:

我正在为多个窗口共享的一系列控件创建一个 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; 

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

我读过例子

【问题讨论】:

在您的输出窗口中,您将看到一个绑定错误,例如对象 MainOptionsPanel 没有属性编号 - 这是真的。只需将您的用户控件 xaml 更改为我的答案。 【参考方案1】:

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

您遇到的问题如下:在您的用户控件中,您会将标签绑定到您的用户控件的 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 中的绑定,您的用户控件也可以工作。但是您必须使用 RelativeSource 绑定到 MainWindow 的 DataContext。

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

【讨论】:

【参考方案2】:

如果您没有指定绑定的RelativeSource,请尝试在构造函数中设置DataContext

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

【讨论】:

说实话,这种方法很糟糕,因为您可以从外部更改数据上下文。【参考方案3】:

你有什么效果:

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

=> 不要不要UserControl 声明中设置DataContext,而是使用RelativeSourceElementName 绑定。

【讨论】:

为什么不设置DataContext?我知道它可以通过多种方式传播到子控件(我认为),但到目前为止,我们的应用程序还没有遇到任何问题。 @mizipzor:这是不好的做法,像这样设置 DataContext 是“从外部”不可见的,并且不切实际,因为 DataContext 的继承通常是您想要和期望的。 实际上,DataContext 的继承(到目前为止)不是我想要的。 CustomControls 是另一回事。但对于 UserControls,我认为它是一种很好的做法。 那么您的意思是从 Usercontrol 定义中删除 DataContext 行?因为在那里我也将它定义为RelativeSource。 @kelmer:是的。它不是同一个对象,您在定义中所做的任何事情都适用于您的实例,在设置 DataContext 的情况下,正如您刚刚展示的那样,这是一个坏主意,因为它会覆盖继承的 DataContext。

强制验证 WPF 中的绑定控件

...文本框绑定到我的业务对象并附加了WPF验证规则。问题是用户可以完美地单击“确定”按钮并关闭对话框,而无需实际将数据输入文本框。验证规则永远不会触发,因为用户甚至没有尝试将信息输入文本框。是否可以强制验证检... 查看详情

WPF 用户控件将数据绑定到用户控件属性

】WPF用户控件将数据绑定到用户控件属性【英文标题】:WPFusercontrolbinddatatousercontrolproperty【发布时间】:2013-08-2923:27:54【问题描述】:我有用户控制权:xaml<UserControlx:Class="controlmaker.checkButton"xmlns="http://schemas.microsoft.com/winfx/200... 查看详情

从 wpf 页面中的组合框(在用户控件中)获取数据

】从wpf页面中的组合框(在用户控件中)获取数据【英文标题】:Getdatasfromacombobox(inausercontrol)inawpfpage【发布时间】:2021-04-2805:20:04【问题描述】:在WPF应用程序中,我想从用户控件中的组合框获取数据并将其传递给页面中的文... 查看详情

WPF 用户控件双向绑定依赖属性

】WPF用户控件双向绑定依赖属性【英文标题】:WPFusercontrolTwowaybindingDependencyProperty【发布时间】:2014-11-1707:13:20【问题描述】:我在用户控件中创建了一个依赖属性,但是用户控件中的更改没有通知给Viewmodel用户控件<UserControl... 查看详情

wpf入门教程系列十五——wpf中的数据绑定

...用WindowsPresentationFoundation(WPF)可以很方便的设计出强大的用户界面,同时WPF提供了数据绑定功能。WPF的数据绑定跟Winform与ASP.NET中的数据绑定功能类似,但也有所不同,在WPF中以通过后台代码绑定、前台XAML中进行绑定,或者两者... 查看详情

数据绑定到 WPF 中的 UserControl

...述】:我有一个想要参与数据绑定的UserControl。我已经在用户控件中设置了依赖属性,但无法正常工作。当我用静态文本(例如BlueText="ABC")调用uc时,它会显示正确的文本。当我尝试将其绑定到本地公共属性时,它始终为空白。<... 查看详情

WPF 数据验证中的绑定失败

...时间】:2012-12-2213:32:54【问题描述】:我正在尝试将我的控件样式中的属性绑定到控件中定义的属性。该控件继承自TextBox,称为ChangeTextBoxWithRangeUnits。我正在尝试从我创建的ValidationRule类绑定到它们。这是我尝试验证文本的设置... 查看详情

MVVM WPF - Viewmodel 命令绑定

...题描述】:我正在使用MVVM模型,我在WPF主窗口中有三个用户控件,每个用户控件的datacontext设置为xaml中的不同视图模型。主窗口还附加到数据上下文中的不同视图模型。主窗口有三个按钮,应该通过命令绑定来绑定,如何通过xa... 查看详情

如何将 WPF 中的命令绑定到控件的双击事件处理程序?

...需要将文本块(或者也可能是图像-无论哪种方式,它是用户控件)的双击事件绑定到我的ViewModel中的命令。TextBlock.InputBindings似乎没有正确绑定到我的命令,有什么帮 查看详情

WPF - 绑定到用户控件之间的列表框的选定项

】WPF-绑定到用户控件之间的列表框的选定项【英文标题】:WPF-Bindtoselecteditemoflistboxbetweenusercontrols【发布时间】:2011-10-1600:33:04【问题描述】:我有两个用户控件,第一个带有一个绑定到客户列表的列表框,该列表显示每个客户... 查看详情

设置绑定到 WPF 用户控件内的自定义 DependencyProperty

】设置绑定到WPF用户控件内的自定义DependencyProperty【英文标题】:SettingupbindingtoacustomDependencyPropertyinsideaWPFusercontrol【发布时间】:2011-01-1802:21:15【问题描述】:我有一个WPF用户控件,其中包含一个名为MyDP的自定义DependencyProperty... 查看详情

如何在 WPF 中的控件上绑定本地属性

】如何在WPF中的控件上绑定本地属性【英文标题】:HowtobindlocalpropertyoncontrolinWPF【发布时间】:2012-01-2417:07:21【问题描述】:我在WPF上有两个控件<ButtonHorizontalAlignment="Center"Name="btnChange"Click="btnChange_Click"Content="ClickMe"/><Label... 查看详情

如何在自定义 wpf 控件上绑定数据网格列的可见性?

...尽管我在此过程中学到了更多东西。(在WPF中使用MVVM和用户控件)场景:我需要创建一个可重复使用的控件,它是一个数据网格, 查看详情

如何将索引属性绑定到 WPF 中的控件

】如何将索引属性绑定到WPF中的控件【英文标题】:HowcanyoubindanIndexedpropertytoacontrolinWPF【发布时间】:2010-12-1221:13:45【问题描述】:给定ThisClassShouldBeTheDataContext类的实例作为视图的DatacontextclassThisClassShouldBeTheDataContextpublicContactsC... 查看详情

WPF 自定义用户控件绑定在列表视图中始终返回 false

】WPF自定义用户控件绑定在列表视图中始终返回false【英文标题】:WPFCustomusercontrolbindingalwaysreturnfalseinlistview【发布时间】:2021-10-2213:51:30【问题描述】:我最近开始使用WPF,所以我并不了解所有内容。我的Xaml文件中有一个列表... 查看详情

WPF 将 TextBlock 绑定到自己 ViewModel 中的特定列表项

...ItemViewModel”-List的属性时遇到了问题。HomeView.xaml是一个用户控件,显示在主窗口上。我在所有数据所在 查看详情

wpf usercontrol,将按钮的命令参数绑定到父用户控件

】wpfusercontrol,将按钮的命令参数绑定到父用户控件【英文标题】:wpfusercontrol,bindcommandparameterofbuttontotheparentusercontrol【发布时间】:2010-11-2114:54:58【问题描述】:我有一个包含删除按钮的WPFUserControl,我想将整个UserControl作为Comm... 查看详情

找出wpf中的树,模板,命令,事件,数据绑定,样式和主题

找出WPF中的树,模板,命令,事件,数据绑定,样式和主题,树如图:参考技术A不知道说的啥意思,,,追问比如事件,举个例子,就是button控件的click事件。就是相对应的找出几个例子 查看详情