我在我的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”发生更改,则不会调用属性更改的事件处理程序,并且不会刷新该属性。
有什么想法吗?
答案 0 :(得分:1)
在PropertyChangedCallback中,当IsVisibile
属性发生变化时,您会收到通知。现在你再次设置相同的属性,这是没有意义的。
更糟糕的是,设置属性有效地消除了绑定。因此,您不会收到有关绑定源属性的任何后续更改的通知。
不要在回调中再次设置属性。只要做房产改变时发生的一切。我想你可能想设置控件的Visibility
。
答案 1 :(得分:0)
我认为代码是正确的,唯一可能导致DP无法提升的可能是您设置typeof(UserControl)
而不是应该使用typeof(YourControlType)
。测试这个并反馈我。希望可以帮助...
修改强>
是的,Clemens是对的,您必须设置的属性是Visibility
属性,您也可以使用值转换器BoolToVisibilityConverter来实现。