gpt4 book ai didi

c# - 与 MVVM 文本框中的自定义对象绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 10:58:46 27 4
gpt4 key购买 nike

我已经开始使用一些基本应用程序学习 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com