2012-12-09 50 views

回答

3

我認爲你必須做錯你沒有在你的帖子中提到的東西。以下代碼按預期工作,並將MyTestPropertyName打印到控制檯窗口。

public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     DataContext = new MyViewModel(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     MyViewModel viewModel = DataContext as MyViewModel; 
     viewModel.PropertyChanged += MyPropertyChangedEventHandler; 
     viewModel.NotifyPropertyChanged(); 
    } 

    private void MyPropertyChangedEventHandler(object sender, PropertyChangedEventArgs e) 
    { 
     Console.WriteLine(e.PropertyName); 
    } 

} 

public class MyViewModel : INotifyPropertyChanged 
{ 
    public void NotifyPropertyChanged() 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs("MyTestPropertyName")); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

應當指出的是,這是很可怕的設計,而僅作爲一個概念證明,你的確可以訂閱事件的視圖模型的代碼隱藏。

+0

謝謝Takkara,我明白爲什麼這是可怕的設計,但我不確定如何改進它。我在3D球體上有標記,當用戶選擇一個標記時,我用一條線加入它們。我在後面的視圖代碼中進行行計算,並且我的視圖模型知道選擇的點何時發生了更改,因此問題。 –

+0

當您使用以下方式觸發更改時,它將起作用:viewModel.NotifyPropertyChanged();但如果更改是通過UI觸發的,它似乎不起作用。用戶界面中的按鈕單擊會觸發虛擬機本身的更改通知,但該更改從不反映在viewModel.PropertyChanged + = MyPropertyChangedEventHandler; –

+0

這是正確的答案。注意到這是一個糟糕的設計實踐。 –

1

你會需要或者訂閱PropertyChanged事件的每個依賴屬性(即實現INotifyPropertyChanged屬性),或修改您的MyViewModel類從屬性的制定者引發一個事件(依賴或以其他方式)您有興趣收到通知,然後訂閱常見事件。