c# – 如何在更新属性时调用代码隐藏方法?

我需要的是当我的视图模型上的属性更新时,能够在我的视图类的代码隐藏中执行代码.我的理解是我需要使用依赖属性.

我的视图模型确实实现了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值更新时,无论是通过绑定,代码等,都会调用此方法.

点赞