我想将网格中的一系列文本框绑定(bind)到一个对象的属性中,它本身就是我的 ViewModel 中的另一个属性(数据上下文)。
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
类(class)成员Name
和Age
是否自己筹集了INPC?
如果您想更新 ViewModel
中的 Name
或 Age
的值并将其反射(reflect)在 View 中,您需要它们也可以在 Person
类中提高单独更改的属性。
绑定(bind)没问题,但是 View 模型没有通知 View 更改。还请记住 TextBox
的 UpdateSourceTrigger
默认情况下是 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 的建议进行绑定(bind):
<StackPanel>
<TextBox Text="{Binding CurrentPerson.Name}" />
<TextBox Margin="15"
Text="{Binding CurrentPerson.Age}" />
</StackPanel>
并在您输入时更新 View 模型:
<StackPanel DataContext="{Binding CurrentPerson}">
<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Margin="15"
Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
关于c# - 绑定(bind)到对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15610887/