可能であれば、これを避けることをおすすめします。必要な場合は、PropertyChanged
イベントを購読してください。
私はこのコードをコードビハインドコンストラクタに配置します。
INotifyPropertyChanged viewModel = (INotifyPropertyChanged)this.DataContext;
viewModel.PropertyChanged += (sender, args) => {
if (!args.PropertyName.Equals("foo"))
return;
// execute code here.
};
保守性の先端あなたはデータコンテキストが、その型にキャスト、プロパティを持っているタイプであることを確実に知るとnameof
オペレータではなく、魔法の文字列を使用している場合。
編集(DataContextの変化に反応)
あなたはデータコンテキストの変更を処理するためにDataContextChangedイベントをサブスクライブすることができるはずです。
INotifyPropertyChanged previous;
// constructor
public SomeCodeBehindClass()
{
previous = (INotifyPropertyChanged)this.DataContext;
DataContextChanged += (sender, args) => SubscribeToFooChanges((INotifyPropertyChanged)args.NewValue);
SubscribeToFooChanges(previous);
}
// subscriber
private void SubscribeToFooChanges(INotifyPropertyChanged viewModel)
{
if (previous != null)
previous.PropertyChanged -= FooChanged;
previous = viewModel;
if (viewModel != null)
viewModel.PropertyChanged += FooChanged;
}
// event handler
private void FooChanged (object sender, PropertyChangedEventArgs args)
{
if (!args.PropertyName.Equals("foo"))
return;
// execute code here.
}
私は質問を正しく理解していませんが、ViewModelで直接バインドされたプロパティの変更に反応しないのはなぜですか? – Fang
良い質問ですが、質問にこれを言及する必要があります。その理由は、(特定のコントロールに列を追加することによって)コントロールを直接変更する必要があるためです。私はビューモデルでそれをしたくありません。 – MarkusParker
プロパティFooには何が結びついていますか? – adminSoftDK