我已经开始使用一些基本应用程序学习 MVVM,并且我刚刚遇到了以下绑定(bind)问题。
我的 View 中有 2 个文本框,比如 Student_name 和 Student_year。我在我的 View 模型中实现了一个 Student 类及其属性。但是,实际的学生类在我的模型层中。
<TextBox x:Name="StuName"
Text="{Binding Path=MyStudent.Name, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
<TextBox x:Name="StuYear"
Text="{Binding Path=MyStudent.Year, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
View 模型:
private Student _myStudent = new Student();
public Student MyStudent
{
get { return _myStudent ; }
set
{
if (value != _myStudent )
{
_myStudent = value;
OnPropertyChanged("MyStudent");
}
}
}
型号(学生类):
public string Name
{
get { return _name; }
set
{
if (_name!= value)
{
_name= value;
OnPropertyChanged("Name");
}
}
}
我可以看到将值从 VM 绑定(bind)到 View 时一切正常。但是,另一种方式在这里表现得有点棘手..
当我在文本框中更改名称/年份时,控件必须落在 Viewmodel 的 Set 属性上吗?相反,它直接转到 Model 的 Set 属性。
例如,当我修改 txtbox 'StuName' 时,会调用 Student 类的 SET 方法。但不是 Viewmodel(MyStudent 对象)的 SET 方法。
我不确定为什么会这样。是因为我直接将 Student.Name 绑定(bind)到文本框吗?在 Viewmodel 类中处理此 SET 操作的替代方法是什么。
提前致谢。
PS:我已经正确实现了 INotifyPropertyChanged 接口(interface),并且其他绑定(bind)(原始数据类型)与其他控件一起工作正常。
最佳答案
正如 Philip Stuyck 在 his answer 中正确指出的那样, ViewModel 只有 Student
的 setter 实例,它永远不会改变。所以 ViewModel 上的 setter 永远不会被调用。绑定(bind)转到该实例的名称属性。
另一种方法是显式地将 name 属性包装在 ViewModel 中。这允许在模型和 View 模型之间更清晰地分离关注点。 IE。现在你的模型实现了INotifyPropertyChanged
哪个 IMO 属于 ViewModel,因为通常它只用于触发 View 更新。您的 ViewModel 看起来像这样:
class StudentViewModel
{
private Student _myStudent = new Student();
public string Name
{
get { return _myStudent.Name ; }
set
{
if (value != _myStudent.Name )
{
_myStudent.Name = value;
OnPropertyChanged("Name");
}
}
}
}
另一方面,您的模型变得更简单,因为它不必实现
INotifyPropertyChanged
了。
关于c# - 与 MVVM 文本框中的自定义对象绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28470609/