如何更新WPF用户控件中的依赖项属性?

时间:2013-03-06 18:30:51

标签: wpf user-controls dependency-properties

我在我的WPF用户控件上创建了一个依赖项属性,该属性将在我的父用户控件中进行数据绑定。我在我的viewmodel上实现了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”发生更改,则不会调用属性更改的事件处理程序,并且不会刷新该属性。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

不要在回调中再次设置属性。只要做房产改变时发生的一切。我想你可能想设置控件的Visibility

答案 1 :(得分:0)

我认为代码是正确的,唯一可能导致DP无法提升的可能是您设置typeof(UserControl)而不是应该使用typeof(YourControlType)。测试这个并反馈我。希望可以帮助...


修改

是的,Clemens是对的,您必须设置的属性是Visibility属性,您也可以使用值转换器BoolToVisibilityConverter来实现。