画面に「現在のレコード」が編集されているセクションがあるとしましょう..私のビューモデルには、現在編集されているすべてのプロパティを持つクラスがあります。
class Record {
public string Notes { get { return "Foo"; } set { _notes = value; Notify("Notes"); }
}
そして、このクラスをビュー モデルに追加します。
class AdjustsmentViewModel {
public Record CurrentRecord { get { return new Record(); }}
}
ビューで CurrentRecord の Notes プロパティにバインドするにはどうすればよいですか? 私はこれを試しました:
<TextBox Text="{Binding CurrentRecord.Notes, Mode=TwoWay}" VerticalScrollBarVisibility="Auto" TextWrapping="WrapWithOverflow" AcceptsReturn="True" />
ただし、これは機能しません。また、周囲の StackPanel の DataContext を設定してみました:
<StackPanel DataContext="{Binding CurrentRecord}">
その後、TextBox {Binding Notes} と {Binding Path=Notes} で試しましたが、どれも機能していないようです。
おそらく上記は本当にうまくいくはずですが、私は他の場所で何かを台無しにしていますか?
アップデート
これはユーザー コントロールで発生しています。このユーザー コントロールには、親ウィンドウとは別のビュー モデルがあります。
this.DataContext = UnityUtil.Resolve<AdjustmentsViewModel>();
また、バインディング エラーが表示されます: 「Notes」プロパティが「オブジェクト」「MainViewModel」に見つかりません
そのビュー モデルがメイン ウィンドウに設定されます。
正しい ViewModel がバインドされていることを確認するために、このプロパティをビューモデルに直接追加しました。
public string Notes2 { get { return "Bar"; } }
ビュー内の対応するテキストブロック:
<TextBlock Text="{Binding Path=Notes2}" />
これは期待どおりに機能します。
大成功
ライアンのおかげで、問題を見つけることができました。プロパティ自体ではなく、CurrentRecord の設定方法にありました。私のセッターでは、INotifyPropertyChange ハンドラーを呼び出しますが、その中にプロパティの古い名前が含まれていました。そのため、ビューは CurrentRecord 通知を取得していなかったので、Notes 通知が十分ではなかったと思います..
結論として、この表記は正しいです: {Binding Path=CurrentRecord.Notes}