Привязка к ViewModel.SubClass.Property (подчиненное свойство)
скажем, у меня на экране есть раздел, в котором "текущая запись" отредактировано .. так что моя модель представления имеет класс со всеми редактируемыми в данный момент свойствами, такими как:
class Record {
public string Notes { get { return "Foo"; } set { _notes = value; Notify("Notes"); }
}
и мы добавим этот класс в модель представления:
class AdjustsmentViewModel {
public Record CurrentRecord { get { return new Record(); }}
}
Как я могу привязать к Notes свойство CurrentRecord на мой взгляд? Я попробовал это:
<TextBox Text="{Binding CurrentRecord.Notes, Mode=TwoWay}" VerticalScrollBarVisibility="Auto" TextWrapping="WrapWithOverflow" AcceptsReturn="True" />
Это не работает, однако. Я также попытался установить DataContext окружающего StackPanel:
<StackPanel DataContext="{Binding CurrentRecord}">
После этого я попытался в моих TextBox {Binding Notes} и {Binding Path = Notes}, но ни один из них, похоже, не работает.
Возможно, выше действительно должно работать, и я что-то напортачу?
Update
Это происходит в пользовательском элементе управления. Этот пользовательский элемент управления имеет отдельную модель представления из родительского окна.
this.DataContext = UnityUtil.Resolve<AdjustmentsViewModel>();
Также я вижу ошибку привязки:'Notes' property not found on 'object' ''MainViewModel'
та модель представления установлена в главном окне.
чтобы убедиться, что у меня есть правильная привязка ViewModel, я просто добавил это свойство непосредственно в viewmodel:
public string Notes2 { get { return "Bar"; } }
и соответствующий текстовый блок в виде:
<TextBlock Text="{Binding Path=Notes2}" />
это работает как ожидалось.
Great Success
Благодаря Райану я смог найти проблему. Это было не в самом свойстве, а в том, как был установлен CurrentRecord. В моем установщике я вызываю обработчик INotifyPropertyChange, но в нем было старое имя свойства. Таким образом, представление не получало уведомление CurrentRecord, поэтому я думаю, что уведомления Notes было недостаточно.
В заключение, это обозначение является правильным:{Binding Path=CurrentRecord.Notes}