如何在更新属性时调用代码隐藏中的方法?

时间:2011-03-04 21:09:00

标签: c# wpf xaml binding dependency-properties

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

我的视图模型确实实现了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的方法。

这些问题往往是我错过的一些简单明显的事情。然而,我正在尝试的任何事情都无法帮助我解决这个问题。

1 个答案:

答案 0 :(得分:2)

  

当我在视图中为属性的setter设置断点时,即使在我观察视图模型中的值更改并且引发了PropertyChanged事件之后,它也永远不会被击中。最终,我的目标是能够在设置器中添加更多代码。

你不能这样做。当您使用DependencyProperties时,绑定属性更改时永远不会调用setter。它的唯一目的是允许您从代码中设置DP。

您需要在DP上的元数据中添加PropertyChangedCallback,并在那里添加额外的代码。当DP值更新时,无论是通过绑定,代码等,都会调用它。