关键词:
【中文标题】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
,而是使用RelativeSource
或ElementName
绑定。
【讨论】:
为什么不设置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事件。就是相对应的找出几个例子 查看详情