如何使 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“包装器”实现的调用。 您也可以直接调用属性系统APIGetValueSetValue

当绑定需要更新依赖属性时,这就是 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 C#如何使用鼠标使控件可拖动

WPF UserControl:使多个链接的依赖项属性保持同步,而不会导致递归循环 堆栈溢出

ItemsControl 中 DataTemplate 中的 WPF UserControl - 如何绑定到 ItemsSource 的父级

如何绑定到WPF中的usercontrol内的控件?

如何将我的UserControl从另一个项目(Dll)添加到我的WPF解决方案?