2

我有一些嵌套的視圖模型,實現INotifyPropertyChanged。我想將事件偵聽器綁定到嵌套屬性路徑(例如"Parent.Child.Name"),很像FrameworkElement依賴項屬性可以綁定到任意嵌套屬性。Co-opting綁定來收聽沒有FrameworkElement的PropertyChanged事件

但是,我只想要一個像PropertyChanged事件偵聽器的東西 - 實際上我沒有任何要綁定的UI元素。有什麼方法可以使用現有的框架來建立這樣的事件源?理想情況下,我不需要修改我的視圖模型類(因爲這在Silverlight中不需要常規數據綁定)。

回答

2

您當然可以選擇綁定/依賴項屬性基礎結構來偵聽對嵌套屬性的更改。下面的代碼是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); 
    } 
} 

所以我定義我自己DependencyProperty,沒有任何UI本身(只是MainWindow類)的一部分,並綁定「兒童.Name「直接。然後我可以在Child.Name更改時收到通知。

這是否適合您?

+0

這可以工作,但我希望這樣做沒有實際的UI控制開銷,或綁定到UI線程。如果我不再需要這種情況,我將如何取消訂閱通知? – kpozin

+0

您不應該需要UI控件 - 任何派生自DependencyObject的對象都可以定義自己的DependencyProperty。取消訂閱應該像SetBinding(ChildNameProperty,null)一樣簡單。 –