我需要的是当我的视图模型上的属性更新时,能够在我的视图类的代码隐藏中执行代码.我的理解是我需要使用依赖属性.
我的视图模型确实实现了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事件之后,它也永远不会被击中.最终,我的目标是能够在setter中添加更多代码.
如果你很好奇,毛茸茸的细节就是我需要根据这个值在多个StackPanel之间移动一个TextBlock.我似乎无法找到XAML唯一的方法.
通常情况下,这些问题都是我错过的简单明显的事情.但是,我正在尝试的任何事情都无法帮助我解决这个问题.
最佳答案
When I put a break-point on the setter for the property in my view, it never gets hit even after I watch the value change in the view-model, and the PropertyChanged event raised. Ultimately, my goal is to be able to put more code in the setter.
你不能这样做.当您使用DependencyProperties时,绑定属性更改时永远不会调用setter.它的唯一目的是允许您从代码中设置DP.
相反,您需要在DP上为元数据添加PropertyChangedCallback,并在那里添加额外的代码.当DP值更新时,无论是通过绑定,代码等,都会调用此方法.