Silverlight 选择绑定以侦听不带FrameworkElement的PropertyChanged事件

Silverlight 选择绑定以侦听不带FrameworkElement的PropertyChanged事件,silverlight,data-binding,dependency-properties,inotifypropertychanged,Silverlight,Data Binding,Dependency Properties,Inotifypropertychanged,我有一些嵌套视图模型,它们实现了INotifyPropertyChanged。我希望将事件侦听器绑定到嵌套的属性路径(例如,“Parent.Child.Name”),就像FrameworkElement依赖项属性可以绑定到任意嵌套的属性一样 然而,我只想要一个类似于PropertyChanged事件监听器的东西——实际上我没有任何想要绑定的UI元素。有没有办法使用现有的框架来设置这样的事件源?理想情况下,我不需要修改视图模型类(因为Silverlight中的常规数据绑定不需要这样做)。您当然可以

我有一些嵌套视图模型,它们实现了
INotifyPropertyChanged
。我希望将事件侦听器绑定到嵌套的属性路径(例如,
“Parent.Child.Name”
),就像
FrameworkElement
依赖项属性可以绑定到任意嵌套的属性一样


然而,我只想要一个类似于
PropertyChanged
事件监听器的东西——实际上我没有任何想要绑定的UI元素。有没有办法使用现有的框架来设置这样的事件源?理想情况下,我不需要修改视图模型类(因为Silverlight中的常规数据绑定不需要这样做)。

您当然可以选择绑定/依赖属性基础结构来侦听对嵌套属性的更改。下面的代码是WPF,但我相信您可以在Silverlight中执行类似的操作:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new Parent { Child = new Child { Name = "Bob" } };
        this.SetBinding(ChildNameProperty, new Binding("Child.Name"));
    }

    public string ChildName
    {
        get { return (string)GetValue(ChildNameProperty); }
        set { SetValue(ChildNameProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ChildName.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ChildNameProperty =
        DependencyProperty.Register("ChildName", typeof(string), typeof(MainWindow), new UIPropertyMetadata(ChildNameChanged));

    static void ChildNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MessageBox.Show("Child name is now " + e.NewValue);
    }
}
因此,我定义了自己的
dependencProperty
,而不是任何UI本身的一部分(只是
MainWindow
类),并将“Child.Name”直接绑定到它。然后,当
Child.Name
发生更改时,我可以收到通知


这对你有用吗?

可以,但我希望这样做不会带来实际UI控件的开销,也不会与UI线程绑定。在这种情况下,当我不再需要通知时,如何取消订阅通知?您不应该需要UI控件-从DependencyObject派生的任何东西都可以定义自己的DependencyProperty。取消订阅应该和设置绑定一样简单(ChildNameProperty,null)。