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)。