4

Clemen の優れた回答に対するさらなる質問: DataContext values in view code behind。このアプローチを使用した場合、この時点で VM のプロパティの変更を検出できますか? これらは、 を通じて正しく実装されますINotifyPropertyChanged

var viewModel = DataContext as MyViewModel;
//How would one detect a property change on viewModel?
//Tried viewModel.PropertyChange which doesn't fire.
4

2 に答える 2

5

投稿で言及していない何か間違ったことをしているに違いないと思います。次のコードは期待どおりに機能し、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
}

これはひどい設計であり、コード ビハインドで ViewModel のイベントを実際にサブスクライブできるという概念実証としてのみ設計されていることに注意してください。

于 2012-12-09T06:41:14.697 に答える
1

PropertyChanged各依存関係プロパティ (つまり、 を実装するプロパティ)のイベントをサブスクライブするかINotifyPropertyChanged、クラスを変更MyViewModelして、通知を受け取りたいプロパティ (依存関係またはその他) のセッターからイベントを発生させる必要があります。次に、共通イベントにサブスクライブします。

于 2012-12-09T06:35:48.547 に答える