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

标签 c# xaml mvvm data-binding

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

相关文章:

c# - 在 C# 中接受小数作为输入需要帮助

c# - WPF 将 ObservableCollection 绑定(bind)到 UserControl 的意外行为

wpf - 带有 WebBrowser 的 WPF 中的模型 View ViewModel

c# - 将 Viewmodel 绑定(bind)到 View

c# - 当用户在c#中单击它时获取图像的来源

c# - 需要驾驶距离库/应用程序,我可以与之交谈

javascript - 使用 AngularJS 和 ASP.NET Web API 上传/下载字节数组

visual-studio - VS2010 只需 5 秒即可轻松打开任何 XAML 文件(!)

c# - WPF DataGrid 似乎没有虚拟化行

c# - MVVM WPF Datagrid TemplateColumn 组合框所选项目不起作用