【问题标题】:How to update dependency property in WPF User control?如何更新 WPF 用户控件中的依赖属性?
【发布时间】:2013-03-06 18:30:50
【问题描述】:

我在我的 WPF 用户控件上创建了一个依赖属性,该属性将数据绑定在我的父用户控件中。我已经在我的视图模型上实现了INotifyPropertyChanged,以便在值更改时发送通知。

用户控制代码:

public bool IsVisibile {
get { return (bool) GetValue(IsVisibileProperty); }
set { SetValue(IsVisibileProperty, value); }}

public static readonly DependencyProperty IsVisibileProperty =
        DependencyProperty.Register("IsVisibile", typeof(bool), typeof(UserControl),
                                    new PropertyMetadata(default(bool), VisiblePropertyChangedCallback));

    private static void VisiblePropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        if (dependencyPropertyChangedEventArgs.NewValue != null)
        {
            ((UserControl) dependencyObject).IsVisibile = (bool) dependencyPropertyChangedEventArgs.NewValue;
        }

    }

父用户控制用法:

<uc:UserControl IsVisible="{Binding IsViewModelVisible, UpdateSourceTrigger=PropertyChanged}"

如果“IsViewModelVisible”发生更改,则不会调用属性更改事件处理程序并且不会刷新属性。

有什么想法吗?

【问题讨论】:

    标签: wpf user-controls dependency-properties


    【解决方案1】:

    在 PropertyChangedCallback 中,当您的 IsVisibile 属性发生更改时,您会收到通知。现在你再次设置相同的属性,那是没有意义的。

    更糟糕的是,设置属性会有效地移除绑定。因此,您将不会收到有关绑定源属性的任何后续更改的通知。

    不要在回调中再次设置属性。当财产发生变化时,做任何事情。我猜你可能想设置控件的Visibility

    【讨论】:

    • 感谢克莱门茨的回复。当我的 VM 属性发出更改通知时,依赖属性会自动更新吗?
    • 是的,这就是绑定的作用。
    【解决方案2】:

    我认为代码是正确的,唯一可能导致 DP 不提高的原因可能是您设置了typeof(UserControl),而不是您应该使用typeof(YourControlType)。对此进行测试并反馈给我。希望能帮上忙……


    编辑

    是的,Clemens 是对的,你必须设置的属性是Visibility 属性,你也可以使用一个值转换器,BoolToVisibilityConverter 作为实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多