Подтвердить что ты не робот

Привязка к объекту объекта

Я хочу привязать серию TextBoxes в сетке к свойствам объекта, который сам по себе является другим свойством в моей модели ViewModel ( DataContext).

CurrentPerson состоит из Name и Age свойств

Внутри ViewModel:

public Person CurrentPerson { get; set ... (with OnPropertyChanged)}

Xaml:

<TextBox Text="{Binding Name}" >
<TextBox Text="{Binding Age}" >

Я не был уверен в использовании подхода, я установил другой DataContext в области сетки без каких-либо результатов. Также попытался снова установить источник и путь, например Source = CurrentPerson, Path = Age, без каких-либо результатов, это было для и посмотрим, произойдут ли какие-либо изменения или нет.

Как мне это достичь?

4b9b3361

Ответ 1

Являются ли ваши члены класса Person Name и Age сами поднимут INPC?

Если вы хотите обновить значение Name или Age в ViewModel и отразить это в представлении, вам нужно, чтобы они изменяли свойство, измененное индивидуально внутри класса Person.

Связывание прекрасное, но представление в значительной степени не сообщается об изменениях из модели представления. Также помните, что UpdateSourceTrigger для TextBox по умолчанию: LostFocus, Установка этого параметра в PropertyChanged будет обновлять вашу строку в ViewModel в качестве вашего ввода.

Простой пример:

public class Person : INotifyPropertyChanged {
  private string _name;
  public string Name {
    get {
      return _name;
    }

    set {
      if (value == _name)
        return;

      _name = value;
      OnPropertyChanged(() => Name);
    }
  }

  // Similarly for Age ...
}

Теперь ваш xaml будет:

<StackPanel DataContext="{Binding CurrentPerson}">
  <TextBox Text="{Binding Name}" />
  <TextBox Margin="15"
            Text="{Binding Age}" />
</StackPanel>

или вы также можете связать, как было предложено @Kshitij

<StackPanel>
  <TextBox Text="{Binding CurrentPerson.Name}" />
  <TextBox Margin="15"
            Text="{Binding CurrentPerson.Age}" />
</StackPanel>

и обновить модель представления в качестве ввода

<StackPanel DataContext="{Binding CurrentPerson}">
  <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
  <TextBox Margin="15"
            Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>

Ответ 2

Попробуйте следующее:

<TextBox Text="{Binding CurrentPerson.Name}" />
<TextBox Text="{Binding CurrentPerson.Age}" />

По существу, вы можете перейти к свойствам с помощью разделителя ..

В будущем, если вы хотите развернуть в коллекции, вы можете использовать MyCollection[x] так же, как в коде (где x будет заменено на жестко закодированное число, а не на переменную).