如何使 WPF UserControl 中的一个 DependencyProperty 更改另一个 [重复]
Posted
技术标签:
【中文标题】如何使 WPF UserControl 中的一个 DependencyProperty 更改另一个 [重复]【英文标题】:How to make one DependencyProperty change another one in a WPF UserControl [duplicate] 【发布时间】:2020-09-11 15:35:51 【问题描述】:我已经按照这篇文章中的示例:Dependency Property is not updating my Usercontrol 并从这里下载了示例:http://www.mediafire.com/file/y1qvv6b68tjibh1/DependencyPropertyInsideUserControl.zip/file
我想要做的是在 UserControl 上添加一个新属性,该属性的值是从现有的属性 CellValue 中设置的。
所以用户控件是这样的:
<UserControl x:Class="DependencyPropertyInsideUserControl.control"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Height="Auto" Width="Auto">
<Grid.RowDefinitions>
<RowDefinition Height="35"/>
<RowDefinition Height="35" />
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Text="Binding Path = CellValue" Name="textBox2" />
<TextBox Grid.Row="1" Text="Binding Path = MyNewValue" Name="myNewTextBox" /> <-- I have added this in
</Grid>
现在我希望 MyNewValue 在用户更新 CellValue 时自动更新。 所以我在后面的代码中做了如下操作:
添加如下:
public string MyNewValue
get return (string)GetValue(MyNewValueProperty);
set SetValue(MyNewValueProperty, value);
public static readonly DependencyProperty MyNewValueProperty =
DependencyProperty.Register("MyNewValue", typeof(string), typeof(control), new FrameworkPropertyMetadata
BindsTwoWayByDefault = true,
);
并在 CellValue 的处理程序中添加了对 SetValue(MyNewValueProperty, value) 的第二次调用:
public string CellValue
get
return (string)GetValue(CellValueProperty);
set
SetValue(CellValueProperty, value);
SetValue(MyNewValueProperty, value); <-- Update MyNewValueProperty whenever CellValueProperty gets updated
但它不起作用,MyNewValue 永远不会在 CellValue 发生变化时发生变化。 我只希望用户更改一个值,即 CellValue 修改另一个属性时如何更改 UserControl 中的一个属性?
【问题讨论】:
【参考方案1】:您缺少的是“CLR '包装器'”和底层DependencyProperty
之间的区别。你可以在这里阅读它们:Dependency properties overview。我会提请您注意一个特定的引用:
Setting properties in code
在代码中设置依赖属性值通常只是对 CLR“包装器”公开的 set 实现的调用。获取属性值本质上也是对 get“包装器”实现的调用。 您也可以直接调用属性系统API
GetValue
和SetValue
。
当绑定需要更新依赖属性时,这就是 WPF 框架在内部执行的操作。它不调用“CLR 'wrapper'”(即public string CellValue
),它直接调用SetValue
。
因此,如果您需要在依赖属性更改时执行某些操作,请不要将其放入set
,就像使用普通属性一样。相反,您注册一个PropertyChangedCallback
。它将在更改时被调用,并且参数包含属性的旧值和新值。
public string CellValue
get return (string)GetValue(CellValueProperty);
set SetValue(CellValueProperty, value);
public static readonly DependencyProperty CellValueProperty =
DependencyProperty.Register("CellValue", typeof(string), typeof(control),
new PropertyMetadata(default(string), CellValue_Changed));
private static void CellValue_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
((control)d).MyNewValue = (string)e.NewValue;
【讨论】:
以上是关于如何使 WPF UserControl 中的一个 DependencyProperty 更改另一个 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 UserControl 访问 WPF 页面中的公共变量?
WPF UserControl:使多个链接的依赖项属性保持同步,而不会导致递归循环 堆栈溢出
ItemsControl 中 DataTemplate 中的 WPF UserControl - 如何绑定到 ItemsSource 的父级