8

画面に「現在のレコード」が編集されているセクションがあるとしましょう..私のビューモデルには、現在編集されているすべてのプロパティを持つクラスがあります。

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}

4

2 に答える 2

8

上記は機能するはずです。 {Binding Path=CurrentRecord.Notes} は正しいです。データコンテキストがビューモデルに設定されていることを確認できますか?

ビューモデルが INotifyPropertyChanged を実装しているかどうかも確認してください。

編集:これを再現するためにサンプルプロジェクトを作成しました。INotifyPropertyChanged を実装する必要はありません。datacontext が VM に設定されている場合にのみ機能します。

于 2012-07-23T20:11:35.583 に答える
1

CurrentRecord プロパティが 1) 設定され、2) 変更が発生したことを UI レイヤーに通知していることを確認してください。

于 2012-07-23T23:01:04.980 に答える