18

グリッド内の一連のTextBoxを、それ自体がViewModel(DataContext)の別のプロパティであるオブジェクトのプロパティにバインドしたいと思います。

CurrentPersonNameAgeプロパティで構成されます

ViewModelの内部:

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

Xaml:

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

使用する方法がわかりませんでした。グリッドスコープに別のDataContextを設定しましたが、結果はありませんでした。また、Source = CurrentPerson、Path = Ageなどのソースとパスを設定してみましたが、結果はありませんでした。これらは試用版であり、を参照してください。変更があるかどうか。

これをどのように達成すればよいですか?

4

2 に答える 2

28

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

またはのいずれかの値を更新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>
于 2013-03-25T11:09:01.937 に答える
20

これを試して:

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

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

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

于 2013-03-25T08:57:26.553 に答える