当我的视图模型上的属性更新时,我需要能够在我的视图类的代码隐藏中执行代码。我的理解是我需要使用依赖属性。
我的视图模型确实实现了INotifyPropertyChanged
。
以下是我的视图模型中的属性:
private DisplayPosition statusPosition;
public DisplayPosition StatusPosition
{
get { return this.statusPosition; }
set
{
this.statusPosition = value;
this.OnPropertyChanged("StatusPosition");
}
}
以下是我视图中的依赖属性:
public DisplayPosition StatusPosition
{
get { return (DisplayPosition)GetValue(StatusPositionProperty); }
set { SetValue(StatusPositionProperty, value); }
}
public static readonly DependencyProperty StatusPositionProperty =
DependencyProperty.Register(
"StatusPosition",
typeof(DisplayPosition),
typeof(TranscriptView),
new PropertyMetadata(DisplayPosition.BottomLeft));
这是我在我的视图类(this.DataContextChanged
的处理程序)中设置我的绑定的地方:
private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Binding myBinding = new Binding("StatusPosition");
myBinding.Source = this.DataContext;
myBinding.NotifyOnTargetUpdated = true;
this.SetBinding(TranscriptView.StatusPositionProperty, myBinding);
}
当我在视图中为属性的setter设置断点时,即使我在视图模型中观察值更改并且引发了PropertyChanged
事件,它也永远不会被击中。最终,我的目标是能够在设置器中添加更多代码。
如果你很好奇,毛茸茸的细节就是我需要根据这个值在多个StackPanel之间移动一个TextBlock。我似乎无法找到一种仅限XAML的方法。
这些问题往往是我错过的一些简单明显的事情。然而,我正在尝试的任何事情都无法帮助我解决这个问题。
答案 0 :(得分:2)
当我在视图中为属性的setter设置断点时,即使在我观察视图模型中的值更改并且引发了PropertyChanged事件之后,它也永远不会被击中。最终,我的目标是能够在设置器中添加更多代码。
你不能这样做。当您使用DependencyProperties时,绑定属性更改时永远不会调用setter。它的唯一目的是允许您从代码中设置DP。
您需要在DP上的元数据中添加PropertyChangedCallback,并在那里添加额外的代码。当DP值更新时,无论是通过绑定,代码等,都会调用它。