平时我们用WPF写代码的时候,界面显示需要使用到的Model是一个类,这个类要继承自IPropertyChanged接口,例如: public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
private string name;
public string Name
{
get { return name; }
set { name = value;OnPropertyChanged("Name"); }
}
private int age;
public int Age
{
get { return age; }
set { age = value;OnPropertyChanged("Age"); }
}
private bool isSelected = false;
/// <summary>
/// 做界面显示时,标识是否被选中
/// </summary>
public bool IsSelected
{
get { return isSelected; }
set { isSelected = value;OnPropertyChanged("IsSelected"); }
}
}而我想把这个Person对象存到数据库时,这个IsSelected属性又没有必要,而且存到数据库对应的model也不需要实现INotifyPropertyChanged接口写一大堆的,如下:public class Person1
{
public string Name { get; set; }
public int Age { get; set; }
}这样才是传统三层里的很简洁的model。
再比如EF的Model要显示到WPF界面上,需要另外建一个model去实现INotifyPropertyChanged接口,然后写一堆方法实现WPF中MVVM中的model与EF中的model相互转换吗?
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
private string name;
public string Name
{
get { return name; }
set { name = value;OnPropertyChanged("Name"); }
}
private int age;
public int Age
{
get { return age; }
set { age = value;OnPropertyChanged("Age"); }
}
private bool isSelected = false;
/// <summary>
/// 做界面显示时,标识是否被选中
/// </summary>
public bool IsSelected
{
get { return isSelected; }
set { isSelected = value;OnPropertyChanged("IsSelected"); }
}
}而我想把这个Person对象存到数据库时,这个IsSelected属性又没有必要,而且存到数据库对应的model也不需要实现INotifyPropertyChanged接口写一大堆的,如下:public class Person1
{
public string Name { get; set; }
public int Age { get; set; }
}这样才是传统三层里的很简洁的model。
再比如EF的Model要显示到WPF界面上,需要另外建一个model去实现INotifyPropertyChanged接口,然后写一堆方法实现WPF中MVVM中的model与EF中的model相互转换吗?
解决方案 »
- C#写的winform程序在用户注销后会停止运行?
- System.Collection.Generic.Dictionary<k,v>和System.Collection.HashTable有什么区别呢
- Winform DataGridView分页实现?? 高手进、嫖客进、老鸨进、在线等!!
- c#树形控件的问题?
- C#进程描述
- 堆栈与堆的区别
- 如何将多个dll文件打包成一个的问题?
- 请问一下,C#中可以理解对象象数组名一样表示地址么
- ado中的null
- C#如何解析hl7,我自己写的代码,在读取的时候不太会,菜鸟求指教。
- 多客户单服务器使用什么socket连接方式
- WPF 新开的窗口,MediaElement播放视频时,遇到载入视频时很卡,如何解决,求帮忙。。。
Model 是用来跨层通讯的,它不可能纠结什么前端里边的或者服务器里边的什么”充血的“功能。所以 Model 中不可能有什么 INotifyPropertyChanged。有这个的是 MVVM 中的 VM层,而不是 三层中的 Model。三层的 Model 定义,只是为了通讯时序列化、反序列化保持高效率、直观容易调试、适应不同版本随时增加或者删除属性时的灵活格式。所以它定义个class Person
{
public string Name;
public int Age;
public DateTime RegistDate;
.......
}这样的失血模型的字段定义就足够了。Model 用来进行简单地序列化、反序列化,所以 MVVM 中几乎可以忽略 M 的作用,而重点其实是丰富的前边万化的 V --> VM 的双向绑定机制。而这个机制的 oneway 方向,也就是 VM 触发 V 的那个方向,就是靠你说的那类东西(你说的大致是最基础最常见的机制的四分之一、五分之一)来实现的。
void SetModel(Jobject); //或者使用 ExpandoObject这就够了!!!!
void SetModel(Jobject x); //或者使用 ExpandoObject可以说,VMMV 中的 M,毫不起眼,基本上是个最底层的调用后台接口时才用一下的东西。编程设计全部从需求出发,从千变万化的 View 出发,然后重构和优化 ViewModel,前端工程师满脑子几乎只有 V 和 VM 的关系问题。基本上对于有点经验的开发者,把什么”增删改查“看成是最低级和机械化的 model 抛出和返回,只有没有创意的前端工程师才会满脑子只有 Model 概念。
是 Model View ViewModel 的简称
他是 MVC 的变种,或是说是 MVC 的引申
由于 MVC 的关系过于宽泛,且 C 又因没多大用处而被丢弃,却又在 V 中加入大量控制逻辑(本应是 C 的)
MVVM 就是为调和这一情况而出现的需要实现 INotifyPropertyChanged 接口的是 ViewModel(VM),而不是 Model(M)
目的是让 V 自动反映出数据的变化
而你的 Person 应隶属于 Model(或更上层)而非 ViewModel
{
[Model]
public string Name.....
这样的声明,然后你自己写一个通用方法,从 ViewModel 中找到所有标记为 ModelAttribute 的属性,在你调用后台数据服务时反射地产生 通用 ExpandoObject或者 JObject 对象。这样就能自动、通用地搞定所有 model 了。数据结构毕竟是设计的最低级基础。但是 Model 如此简单,纠结它并没啥意思。