2013-03-06 79 views
1

我已经创建了我的WPF usercontrol上的依赖项属性,这将是我的父级用户控件中的数据绑定。我在视图模型上实现了INotifyPropertyChanged,以在值更改时发送通知。如何更新WPF用户控件中的依赖项属性?

用户控件代码:

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”的变化,则属性更改事件处理函数不是叫和财产不被刷新。

有什么想法?

回答

1

在PropertyChangedCallback,当你的IsVisibile属性改变你得到通知。现在你再次设置相同的属性,这是毫无意义的。

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

不要在回调重新设置该属性。只要财产发生变化就做任何事情。我想你可能想要设置控件的Visibility

+0

当然劳尔也是对的。 – Clemens 2013-03-06 18:56:31

+0

感谢Clements的回应。当VM属性发出更改通知时,依赖项属性是否会自动更新? – Ash 2013-03-07 09:38:40

+0

是的,这就是绑定的作用。 – Clemens 2013-03-07 10:07:25

0

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


编辑

是,克莱门斯是正确的,你必须设置属性是Visibility属性,也可能会使用值转换器,用于BoolToVisibilityConverter instace。

相关问题