web-dev-qa-db-ja.com

オブジェクトのプロパティへのバインド

bind a 一連のTextBoxesをグリッドに入れてオブジェクトのプロパティそれ自体が私のViewModel(DataContext)の別のプロパティにしたい。

CurrentPersonNameおよびAgeプロパティで構成されます

ViewModel内:

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

XAML:

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

使用する方法がわからなかったので、グリッドスコープに別のDataContextを設定しましたが、結果はありませんでした。また、Source = CurrentPerson、Path = Ageのようなソースとパスを結果なしでもう一度設定しようとしました。変化があるかどうか。

どうすればこれを達成できますか?

14
LastBye

あなたのPersonクラスメンバーNameAgeはINPCを自分で育てていますか?

NameAgeまたはViewModelの値を更新してビューに反映させる場合は、Personクラスも同様です。

バインディングは問題ありませんが、ビューにはビューモデルからの変更がほとんど通知されません。また、UpdateSourceTriggerTextBoxのデフォルトは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>
21
Viv

これを試して:

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

基本的に、.セパレーターを使用してプロパティにドリルダウンできます。

今後の参考のために、コレクションにドリルダウンする場合は、コードと同じようにMyCollection[x]を使用できます(xはハードコードされた数値に置き換えられます変数ではありません )。

15
K Mehta