bind a 一連の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のようなソースとパスを結果なしでもう一度設定しようとしました。変化があるかどうか。
どうすればこれを達成できますか?
あなたの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>
これを試して:
<TextBox Text="{Binding CurrentPerson.Name}" />
<TextBox Text="{Binding CurrentPerson.Age}" />
基本的に、.
セパレーターを使用してプロパティにドリルダウンできます。
今後の参考のために、コレクションにドリルダウンする場合は、コードと同じようにMyCollection[x]
を使用できます(xはハードコードされた数値に置き換えられます変数ではありません )。