c# - WPF 绑定用户控件属性不起作用
问题描述
我有一个用户控件,我试图绑定它的一个属性
用户控制 Xaml
<UserControl x:Class="pi_browser.Testing.Example"
...
x: Name="LabelControl">
<StackPanel x:Name="RootStackPanel">
<Label Content="{Binding Text, ElementName=LabelControl}"/>
</StackPanel>
</UserControl>
用户控制代码隐藏
public partial class Example : UserControl
{
public Example()
{
InitializeComponent();
ExampleViewModel vm = new ExampleViewModel(State);
DataContext = vm;
}
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State",
typeof(Boolean), typeof(Example), new PropertyMetadata(false));
}
主页视图模型
class ExampleViewModel
{
public ExampleViewModel(bool v)
{
val = v;
}
bool val;
public string Text { get => val ? "This worked" : "This didnt work"; }
}
主窗口 Xaml
<Window x:Class="pi_browser.Testing.Tester" ... >
<Grid>
<local:Example State="True"/>
</Grid>
</Window>
在这个例子中,我没有绑定 State 变量,我只传递了一个文字,但理想情况下我想绑定到实际值。
解决方案
State
是一个布尔值,但你绑定到Text
. Text
让我们通过在您的用户控件上创建一个依赖属性来解决一个问题。我们将解决这个Text
问题,而不是布尔State
问题。一旦你解决了这个问题,对State
.
所以要修复Text
,我们需要修复失败的原因:
<Label Content="{Binding Text, ElementName=LabelControl}"/>
您将 设置ElementName
为 UserControl 本身,这正是人们想要的。但随后您告诉绑定查找(记住绑定只是对象在幕后的反映)该属性Text
。该实例/类上Text
不存在该属性......但State
确实存在。很明显,绑定到用户控件上新创建的Text
依赖属性来解决第一个问题。
然后,当您在主页上实例化控件时,您需要然后绑定到,Text
因为该属性也驻留在您的视图模型上。
所以三件事,以及 UserControl 上提到的变化:
- 使您的 ViewModel 遵守
INotifyPropertyChanged
并使Text
属性使用您安装的通知机制。 - 确保您的主页已
DataContext
设置为您的 ViewModel 类的有效实例。 - 绑定到
Text
诸如<local:Example State="{Binding Text}"/>
完成后,该Text
值将正确地流向 UserControl。
推荐阅读
- c# - Graphql 查询:如何创建返回项目之间不同字段的查询
- maven - 将资源部署为单独的 Maven 工件
- pandas - Pandas Dataframe 未在循环中填充
- macos - QT 在 macos 上找不到连接的低功耗蓝牙设备
- sql - 这种情况如何完成加入?
- sql - 在spark SQL中查找温度变化1度的开始时间和结束时间
- stripe-payments - 在 Stripe Plan 元数据中保留类型
- ios - 避免在 UITableView 上下拉以关闭 UIModalPresentationStyle.pageSheet 中呈现的模式
- html - SQL Server:修改电子邮件的显示方式
- docker - NextJS 应用程序需要在文件上传到公共文件夹后重建