老话题,最近一个项目用到wpf mvvm结构

马少华 2016-07-16 10:38:10
加精
有几个疑问,
1,Mvvm到底有什么好处,项目中使用和不使用的区别。和传统的普通三层结构 dal bll window+codebehind相比有什么优势?
2,mvvm里面codebehind里面应不应该放代码,如果可以,那些代码放在codebehind里比较合适?
3,一个项目有N个模块。是为每个模块建一个项目,项目里面分m,v,vm;还是先建好m,v,vm三个项目,然后把所有模块的m,v,vm分别放在这三个项目里面?
请用过或走过湾路的朋友分享一下经验。
...全文
5822 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_42030936 2018-06-29
  • 打赏
  • 举报
回复
可以的,大佬们
bluedoctor 2016-11-17
  • 打赏
  • 举报
回复
1,视图逻辑(视图模型)和视图(视图元素,样式)的解除耦合; 2,视图和视图模型或者模型的双向数据绑定,面向数据驱动视图而不是视图驱动数据; 3,视图和视图模型的分离将界面功能全部代码化,并提供TDD可能性。 参考 http://bbs.csdn.net/topics/392048196
马少华 2016-11-10
  • 打赏
  • 举报
回复
结不了贴?找谁?
足球中国 2016-07-28
  • 打赏
  • 举报
回复
wpf这东东还没有死透啊
strife013 2016-07-28
  • 打赏
  • 举报
回复
我开始用mvvm觉得也没什么用,用多了才发现mvvm真的很好用! 唯一的好处和mvc一样,就是前后端分离,可以让编程逻辑更清晰!
马少华 2016-07-27
  • 打赏
  • 举报
回复
想不到这个贴子被推荐了。人生的第一次啊,感谢版主。 这些时折腾mvvm也有一个多星期了。 应该是新上手,还没怎么感觉很方便。 发现mvvm对泛型支持不怎么好,或者是我不会用。 以前我经常用的 usercontrol CreateUserControl<T>() where T : enttiyClass; 一个分页浏览并可以显示详细信息的用户控件就出来了。对于数据库的实体,这很好用。 再一个就是验证用户输入的时候,遇到验证未通过,给相关控件设置焦点,并选中文本。网上实现的方法相较与codebehind方式过于复杂。 还有绑定按键事件的时候,参数也不知道怎么传给事件,网上都没有简单的方法实现。 还有一个问题,mvvm框架主要是为了解耦而产生的吗?主要是为那几部份解耦合? 我想mvvm也不是万能的吧,大神们请说一下,不适合用mvvm的地方。 总之我还没感觉mvvm很好用,估计是项目太小的原因。
qq_35688224 2016-07-23
  • 打赏
  • 举报
回复
好厉害的呀fly
jimmyz2015 2016-07-21
  • 打赏
  • 举报
回复
好东西,学习了
wanghui0380 2016-07-21
  • 打赏
  • 举报
回复
引用 18 楼 falcomavin 的回复:
能不能接着说一下这个例子用mvvm是怎样的,我真是一点都不懂,但是前面大神的话也看不懂,还是你这个通俗一点。弱弱的问一句,mvvm和mvc是不是asp里面用的,我在vs里面新建wpf没看见什么mvvm的字眼,却在asp里面见过
mvvm只是一个手段而已,不一定用在那里,安卓,IOS开发有人用mvvm,js开发也有人用mvvm,wpf开发有人用mvvm,我写winfrom也用mvvm,当然他并没有一个叫mvvm的项目,只是一种处理手段 比如winform里面我要实现上面的东西只需写 class 视频viewmodel:InotifyProperybyChanged { int m_色调=调用api获得初始色调 public int 色调 { get {retrun m_色调;} set { if(m_色调!=value) { 调用api设置视频色调(); m_色调=value; onPropertyChanged("无所谓_色调"); //其实这里传什么并没有关系,微软所有的地方均没有使用这个值,只是那个接口这么要求那就只好传了,当然有人为了保持一致还是传nameof的值 } } } public void 设置默认属性() { this.色调=128; } void onPropertyChanged(string pname) { //这里只是演示,所以我不展示多线程怎么搞了 if (this.PropertyChanged != null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(pname)); } } public event PropertyChangedEventHandler PropertyChanged; } 这就是一个基本的mvvm 的viewmodel实现,看着好像很多,其实大部分东西都是固定结构,完全可以写成基类或代理类(已经有很多人写好了,完全可以直接用),所以实际项目中你需要完成填空的部分就只是色调属性而已.你可以看到,我半点没管UI逻辑,实际上代码写到这,基本都已经算完成了 后面的部分,对于我winfrom只需要在加3句话(wpf里甚至不用加这3句话,鼠标点点,直接绑定就是) 视频viewmodel vm=new 视频viewmodel(); 色调trackbar.DataBinds.Add("Value",,vm,"色调");//还是顺带提一下,微软后面也觉着输入属性名麻烦,新版语法里加nameof这语法糖,的确是贴心的做法 色调值显示labe.Databinds.add("Text",vm,"色调") 到这里这个功能就完成,虽然看上去代码很多,但实际上,如果去掉固定的InotifyProperybyChanged 接口实现部分,你自己需要完成的东西并不多,何况现在有很多已经成熟的动态代理类,真正使用上估计直接写 public int 色调 {get;set;} 就已经完成整个功能了
黑娃 2016-07-21
  • 打赏
  • 举报
回复
引用 11 楼 wanghui0380 的回复:
首先mvvm并不是一种结构,他只是响应式编程的其中一种手段 为啥要用他,他主要简化开发人员重复无聊的赋值,取值,ui逻辑控制这些东西,同时能帮助程序员理清楚ui上到底有那些东西需要做交互和控制。举个简单例子,我昨天正在做一个视频采集代码,其中一个简单的例子。就是5个属性的控制,色调,亮度,锐度 按传统的代码,你应该在load处写 色调值= 调取api获得视频原始色调 色调.trackbar.value=色调值 色调值显示label.text=色调值 然后 trackbar.滚动事件+=处理值改变 trackbar滚动事件(){ 调取api设置视频新色调 色调值显示label.text=色调.trackbar.value } 然后还有个恢复默认色调你还得写 色调.trackbar.value=128 色调值显示label.text=128 ok,我这只是一个色调值控制而已,这样的重复操作还有亮度,锐度,对比度等多个,你看我得写多少个这样无聊的代码 mvvm滴话其实就简单了,你既然做mvvm,你当然知道怎么弄,我就不写了。 当然我上面的例子,只是说 two way的好处,简化ui代码 另一个好处是,做ui的也可以脱离繁琐的重复劳动,享受抽象带来的快乐。比如传统程序在各种事件处理中被绑架的已经没有条理了,假设几个不同控件的,不同事件间交互,你的在各个“异世界”里架设桥梁,写个各种全局控制量,并小心在事件里控制他们 而mvvm里我不用在管控件如何,我只管逻辑上,他们应该怎么样就ok了
能不能接着说一下这个例子用mvvm是怎样的,我真是一点都不懂,但是前面大神的话也看不懂,还是你这个通俗一点。弱弱的问一句,mvvm和mvc是不是asp里面用的,我在vs里面新建wpf没看见什么mvvm的字眼,却在asp里面见过
屎涂行者 2016-07-19
  • 打赏
  • 举报
回复
wanghui0380 2016-07-17
  • 打赏
  • 举报
回复
对于2 我们说,这不是死的,代码编写取决与,编写的简单性,逻辑性,维护的方便性。怎么简单,怎么不破坏逻辑,怎么方便维护就放那里,假设一个东西,放mvvm里比直接写还麻烦,还要破坏逻辑,维护也不方便,自然他还是写成传统的 对应3 其实也是一样,并没有一定要3个项目,是不是3个,还是1个,甚至是30个项目,我们编写的逻辑实际跟2没有区别。编程又不是写八股文
wanghui0380 2016-07-17
  • 打赏
  • 举报
回复
首先mvvm并不是一种结构,他只是响应式编程的其中一种手段 为啥要用他,他主要简化开发人员重复无聊的赋值,取值,ui逻辑控制这些东西,同时能帮助程序员理清楚ui上到底有那些东西需要做交互和控制。举个简单例子,我昨天正在做一个视频采集代码,其中一个简单的例子。就是5个属性的控制,色调,亮度,锐度 按传统的代码,你应该在load处写 色调值= 调取api获得视频原始色调 色调.trackbar.value=色调值 色调值显示label.text=色调值 然后 trackbar.滚动事件+=处理值改变 trackbar滚动事件(){ 调取api设置视频新色调 色调值显示label.text=色调.trackbar.value } 然后还有个恢复默认色调你还得写 色调.trackbar.value=128 色调值显示label.text=128 ok,我这只是一个色调值控制而已,这样的重复操作还有亮度,锐度,对比度等多个,你看我得写多少个这样无聊的代码 mvvm滴话其实就简单了,你既然做mvvm,你当然知道怎么弄,我就不写了。 当然我上面的例子,只是说 two way的好处,简化ui代码 另一个好处是,做ui的也可以脱离繁琐的重复劳动,享受抽象带来的快乐。比如传统程序在各种事件处理中被绑架的已经没有条理了,假设几个不同控件的,不同事件间交互,你的在各个“异世界”里架设桥梁,写个各种全局控制量,并小心在事件里控制他们 而mvvm里我不用在管控件如何,我只管逻辑上,他们应该怎么样就ok了
猴头 2016-07-17
  • 打赏
  • 举报
回复
x学习了,我理解的,mvvm 就是个 页面和数据的交互方式,简单的交互方式。
kmlkhy 2016-07-17
  • 打赏
  • 举报
回复
学习了。谢谢。
WlxXEGLFntcI6FWv 2016-07-17
  • 打赏
  • 举报
回复
看看啊啊恶法发啊阿发
马少华 2016-07-16
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
不要拿 mvvm、mvc 跟 三层去比较。根本不是同类的东西。一个是具体的前端框架,另一个是整体的(面向于多用户网络系统)抽象模式。 基本上你是技术过渡时期。我不知道你的基础是什么样子的,是那种喜欢死抠一点底层代码、对模式和设计不感兴趣,得过且过喜欢做点“增删改查”千篇一律的界面程序的类型的程序员?还是喜欢挑战软件设计的程序设计师。如果是后者,就应该赶紧“换一种脑筋”。如果是前者,那么就慢慢适应吧,基本上那类程序员不会轻易接受高级的框架,他们一有机会就会把产品设计水平拉回到他们觉得“适合养老”的那类开发模式上。
有道理。
  • 打赏
  • 举报
回复
不要拿 mvvm、mvc 跟 三层去比较。根本不是同类的东西。一个是具体的前端框架,另一个是整体的(面向于多用户网络系统)抽象模式。 基本上你是技术过渡时期。我不知道你的基础是什么样子的,是那种喜欢死抠一点底层代码、对模式和设计不感兴趣,得过且过喜欢做点“增删改查”千篇一律的界面程序的类型的程序员?还是喜欢挑战软件设计的程序设计师。如果是后者,就应该赶紧“换一种脑筋”。如果是前者,那么就慢慢适应吧,基本上那类程序员不会轻易接受高级的框架,他们一有机会就会把产品设计水平拉回到他们觉得“适合养老”的那类开发模式上。
  • 打赏
  • 举报
回复
怪不得你提出的后边两个问题相当地泛泛。后两个问题其实是小伎俩,你可以隐而不发。我给你说明一下这方面的路数,你不能在自己还只是纸上谈兵时就去破坏一国的军事。除非你已经不是纸上谈兵了,可以做一个先锋官了,才能去跟领导谈什么东西。 mvvm 的作用就是让编程变得非常简单。例如界面上有n个选择控件,最多只能由m个选择同时被选择,那么你设计一个类似
public class A: INoifyPropertyChanged
{
    private ObservableCollection<B> _Items = new ObservableCollection<B>();

    public ObservableCollection<B>{ get ......}  

    public int 最多允许几项{ get.......set ........}

   public A()
   {
                _Items.CollectionChanged+= Items_CollectionChanged;
   }

    private void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if(e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
        {
             注册监听 e.NewItems 每个元素的 Selected 事件,事件中保证被选中的 Item 总数不超过上述属性限制
        }
    }
}

public class B: INotifyPropertyChanged
{
    public string Text{ get........set.......}

    public bool Selectd{ get.......set......}

}
这个 model,它是前端的(与后端 model 不是同一个概念)。 mvvm 框假可以自动将将来美工板上使用的任何合适的选择控件的 click 行为跟“Selected 属性设置为 true”的代码行为相绑定,而不需要写一行代码。然后这个 vm 自己能够约束“最多选择多少项”的规则,例如在超出范围时弹出一个异常提示使得选择失败,或者是自动就把其它选择改为false。而最后这个改动又会自动被 mvvm 机制捕获,从而自动更新前端界面。 mvvm 使得你要编写的代码只有几分之一,那么开发和维护的代价也就小很多。 当然,如果你不理解 mvvm 机制,那么照猫画虎也需要半月才能适应。如果你没有类似的基础,那么用大半年年才能学会,也是可能的。
加载更多回复(5)

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧