当前位置:编程学习 > C#/ASP.NET >>

简单MVVM教程(改进版)

我挺久之前发过一个类似的帖子,但是最后沦为口水仗了,非常惭愧。后来有不少朋友给我留言,说是希望我能继续并且完成这个教程,于是我受到他们的鼓励,决定继续。但是这一次,我打算用另一种讲法,摒弃无关的内容,尽量少贴代码,更多的聚焦于为大家提供一些引导,这样一来有兴趣的朋友可以根据我抛出的砖去自行研究。毕竟,编程更需要的是自己钻研和动手实践。

我还是以WPF+MVVM的本地桌面程序为背景,这样一来我们可以不去操心服务器那部分的事情,更加专注我们的MVVM。我打算把最重要的部分放到开头来讲,而接下来这最重要的部分却是全篇教程唯一没有代码的部分。好,下面开始。

MVVM不是什么框架,也不是什么代码生成器,它其实就是一种建议而已。很多朋友对于这个词很困惑:到底我怎么样做,我的程序才是一个标准的MVVM模式?其实我们没有必要去纠结中一点,因为(至少我)还没有见到任何一个程序能实现100%的MVVM。所以我们需要做的是,理解MVVM,然后采用MVVM的思想+现成的框架去搭建出一个程序即可,至于是不是标准的MVVM,不要过分去纠结。我看到过一些失败的例子:有些人为了实现零输出的后台代码,竟然采用一些更加繁琐晦涩的方法来达到此目的——这样就背离了MVVM的初衷了。我个人认为,后台代码不是恶魔,当用则用,但不要滥用。

那么,MVVM是解决所有问题的最终解决方案吗?当然不是。MVVM只解决了界面和数据之间通信的问题,但是除此以外,一般的程序还面临其他很多问题,例如数据的存储,远程通信,耦合问题,效率问题,等等。

这个教程还是以一个小程序为例子,而这次我打算用一个功能非常简单的程序来讲MVVM:我们来做一个电话簿。但是首先你要预习以下知识:
1. 什么是Model,View,ViewModel?
2. 什么是XAML?以及XAML一些最基本的语法
3. 什么是事件(event)?
4. 什么是接口?什么是INotifyPropertyChanged接口?
5. 什么是绑定?绑定这几种方式(OneWay, TwoWay, OneWayToSource)的不同点是什么?

接下来,我们来讨论一下将要用到的工具。

首先是VisualStudio 2010,这个没什么可说的,大家都知道,你也不要吝啬了,升级到2010没有任何坏处。

NuGet——这个工具类似于Maven,主要是为你的项目解决第三方DLL的问题。我们的项目经常要使用其他的DLL,比如Json.NET,而每次去人家的页面下载,然后再复制粘贴到你的项目中,最后再引用,是个很重复单调的过程,用NuGet可以比较优雅的帮你解决这些烦恼。网址:http://nuget.org/

Json.NET——我们有可能会用到这个开源库。原因在于我们可能需要一个简单的数据存储层,所以我打算用Json.NET将DataSet转成BSON(http://bsonspec.org/),然后存入本地文件。读取时候可以用Json.NET将BSON转回DataSet。网址:http://json.codeplex.com/

MEF——Managed Extensibility Framework,这个尚在考虑之中。有些朋友可能对IoC(Inversion of Control)或者Dependency Injection不熟悉,所以我还在犹豫要不要在例子中使用这个。相关知识网址:http://en.wikipedia.org/wiki/Inversion_of_control; http://en.wikipedia.org/wiki/Dependency_injection

MvvmLight Toolkit——这是一个很轻的MVVM框架。麻雀虽小,五脏俱全,应该能满足我们小程序的所有需求。网址:http://mvvmlight.codeplex.com/

Caliburn Micro——另一个MVVM框架。我比较偏爱这个框架。它的思想很巧妙,而且用起来也很方便,上手也很容易。网址:http://caliburnmicro.codeplex.com/

此外,MVVM的框架非常之多,微软有个Prism,但是我不准备用它做例子,因为Prism操心的事情太多了,这个简单教程讲不了那么多。其实最主要的是,我对Prism不熟悉。

如果你对美化UI感兴趣,可以试试这两个东西:
Ookii.Dialogs —— http://www.ookii.org/software/dialogs/
MahApps.Metro —— http://www.theleagueofpaul.com/metro

好了,感兴趣的朋友好好预习,下回见。



--------------------编程问答-------------------- 支持原创。 --------------------编程问答-------------------- 我不懂MVVM,主要这个名字有点井,不过还是挺感兴趣的,嘿嘿
我之前用WPF写的通讯录,http://nonocast.cn/?p=1870
抛砖引玉,仅供参考,顺便看看MVVM怎么实现
板凳瓜子伺候 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 十分期待下文。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- lz还可以加上对 DelegateCommand 和 ReplyCommand 的介绍 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 2 楼 nonocast 的回复:
我不懂MVVM,主要这个名字有点井,不过还是挺感兴趣的,嘿嘿
我之前用WPF写的通讯录,http://nonocast.cn/?p=1870
抛砖引玉,仅供参考,顺便看看MVVM怎么实现
板凳瓜子伺候

already marked. I'm gonna study your example after work tonight. Thank you for sharing this! --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 不懂这个,正好可以一起学 --------------------编程问答-------------------- 支持楼主~~

对于框架来说我最喜欢的是MvvmLight Toolkit,轻巧,无冗余,框架包含的功能都是最常见的,在我每个项目基本都会用到;至于页面导航,MEF等,这些不是必须的,只需在原有框架上面扩展就可以了,最终形成自己的框架;

对于prism这种框架,虽然功能全面,但是相对太复杂,学习成本太高,不过可以借鉴其中一些思想和方法,不是必要的话最好还是从最基础框架开始 --------------------编程问答-------------------- --------------------编程问答-------------------- 看了lz之前的帖子  支持lz继续发帖  --------------------编程问答-------------------- 前段时间刚研究了一下MVVM
总体感觉就是将WPF内数据绑定给独立封装了出来
只是暂时还不是很理解其中需要继承自 INotifyPropertyChanged接口的目的
不知楼主是否可以讲解一下? --------------------编程问答--------------------

public class MainWindowVM : INotifyPropertyChanged 
    { 
        public MainWindowVM() 
        { 
            Employees = GetEmployeeList(); 
        } 
 
        ObservableCollection<Employee> GetEmployeeList() 
        { 
            ObservableCollection<Employee> employees = new ObservableCollection<Employee>(); 
 
            employees.Add(new Employee { MemberID = 1, Name = "John Hancock", Department = "IT", Phone = "31234743", Email = @"John.Hancock@Company.com", Salary = "3450.44" }); 
            employees.Add(new Employee { MemberID = 2, Name = "Jane Hayes", Department = "Sales", Phone = "31234744", Email = @"Jane.Hayes@Company.com", Salary = "3700" }); 
            employees.Add(new Employee { MemberID = 3, Name = "Larry Jones", Department = "Marketing", Phone = "31234745", Email = @"Larry.Jones@Company.com", Salary = "3000" }); 
            employees.Add(new Employee { MemberID = 4, Name = "Patricia Palce", Department = "Secretary", Phone = "31234746", Email = @"Patricia.Palce@Company.com", Salary = "2900" }); 
            employees.Add(new Employee { MemberID = 5, Name = "Jean L. Trickard", Department = "Director", Phone = "31234747", Email = @"Jean.L.Tricard@Company.com", Salary = "5400" }); 
 
            return employees; 
        } 
 
        private ObservableCollection<Employee> _employees; 
        public ObservableCollection<Employee> Employees 
        { 
            get { return _employees; } 
            set 
            { 
                _employees = value; 
                RaiseChange("Employees"); 
            } 
        } 
 
        public event PropertyChangedEventHandler PropertyChanged; 
        public void RaiseChange(string PropertyName) 
        { 
            if (PropertyChanged != null) 
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
        } 
    }


So, in the viewmodel, we now have a few things added, we might as well try and understand what they do !
 
First the class name. MainWindowVM : INotifyPropertyChanged
 
The thing to notice is the 'INotifyPropertyChanged', what this does is inherit the 'INotifyPropertyChanged' interface to the MainWindowVM class. When inheriting this Interface, we now get access to the use of the 'PropertyChangedEventHandler', which we can call at any time we would like to update a public property. This ensures that if the view is binding to that specific public property, it will be updated.
 
But first we have to make sure we implement that PropertyChanged event! and we do that in the bottom of the class by adding this.
--------------------编程问答-------------------- --------------------编程问答-------------------- 回20楼:

ObservableCollection已经实现了'INotifyPropertyChanged'接口和'INotifyCollectionPropertyChanged'接口,拿它做示例讲解'INotifyPropertyChanged'的用法不是很合适;另外在构造函数中初始化属性,是可以不用调用RaiseChange的

这么说吧,比如有一个普通的集合List<string>保存一个Combobox的值列表,如下示例,CityList是在构造函数中初始化的,Combobox中有值,CityListA和CityListB是模拟异步执行,在构造函数执行完后才初始化的,那么就必须调用RaiseChange通知页面属性已更改,通过示例可以看出来CityListB没有调用RaiseChange集合没有内容,而CityListA是可以显示下拉列表内容的

xaml:

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
    <ComboBox Height="23" ItemsSource="{Binding CityList}" HorizontalAlignment="Left" Margin="58,30,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" />
    <ComboBox Height="23" ItemsSource="{Binding CityListA}" HorizontalAlignment="Left" Margin="58,81,0,0" Name="comboBox2" VerticalAlignment="Top" Width="120" />
    <ComboBox Height="23" ItemsSource="{Binding CityListB}" HorizontalAlignment="Left" Margin="58,135,0,0" Name="comboBox3" VerticalAlignment="Top" Width="120" />
  </Grid>
</Window>




   using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication4
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new MainWindowVM();
        }


    }

    public class MainWindowVM : System.ComponentModel.INotifyPropertyChanged
    {
        public MainWindowVM() 
        {
            CityList = new List<string> { "武汉", "上海", "深圳", "北京" };

            #region 模拟异步加载集合
            System.ComponentModel.BackgroundWorker bw = new System.ComponentModel.BackgroundWorker();
            bw.DoWork += (s, e) =>
                {
                    System.Threading.Thread.Sleep(1000);
                    CityListA = new List<string> { "南京", "合肥", "重庆"};
                    CityListB = new List<string> { "天津", "大连", "沈阳" };
                };

            bw.RunWorkerCompleted += (s, e) =>
            {
                RaiseChange("CityListA");
                RaiseChange("CityListB");
            };

            bw.RunWorkerAsync();
            #endregion
        }

        public List<string> CityList
        {
            get;
            private set;
        }

        public List<string> CityListA
        {
            get;
            private set;
        }

        public List<string> CityListB
        {
            get;
            private set;
        }


        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        public void RaiseChange(string PropertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(PropertyName));
        } 

    }

}
--------------------编程问答-------------------- 上面示例有点失误,CityListA 和CityListB都调用RaiseChange了,需要将RaiseChange("CityListB");一句注释掉 --------------------编程问答-------------------- 上面示例中需要将RaiseChange("CityListB");一句注释掉,才能看出CityListB和CityListA绑定的区别 --------------------编程问答-------------------- 这是跟贴继续写下去了,还是会另开新贴 --------------------编程问答-------------------- MVVM如果用一句话来概括(我的理解)就是用属性(property)和界面的元素绑定 --------------------编程问答-------------------- 看了lz之前的帖子 支持lz继续发帖  --------------------编程问答-------------------- viewmodel继承了Inotifypropertychanged接口,model中还需要集成这个接口吗?有些教程model也继承了 --------------------编程问答-------------------- 还是新开个贴的好 --------------------编程问答-------------------- 如果不会学习这东西难不难呢? --------------------编程问答-------------------- 做wp7的东东吗 --------------------编程问答--------------------
引用 25 楼 ycagri 的回复:
这是跟贴继续写下去了,还是会另开新贴

I'll keep updating this. --------------------编程问答--------------------
引用 19 楼 q107770540 的回复:
前段时间刚研究了一下MVVM
总体感觉就是将WPF内数据绑定给独立封装了出来
只是暂时还不是很理解其中需要继承自 INotifyPropertyChanged接口的目的
不知楼主是否可以讲解一下?

Sorr, in company now so not convenient to input Chinese. From my understanding, INotifyPropertyChanged is a contract between your objects and XAML. When you bind your object to XAML's DataContext as well as some properties, without properly implementing INotifyPropertyChanged, you can't trigger UI refresh in your object (usually view model). You can think in this way: for self-aware refresh, XAML only responds to those "good" view models who have implemented INotifyPropertyChanged interface. 

Hopefully this can be helpful to you. --------------------编程问答--------------------
引用 28 楼 lordbaby 的回复:
viewmodel继承了Inotifypropertychanged接口,model中还需要集成这个接口吗?有些教程model也继承了

I'll answer your question tonight after work. --------------------编程问答-------------------- 看着有点吃力,新手啊 --------------------编程问答-------------------- 呵呵,又来了

我来吐槽把,别跟我mvvm了

其实你每天都在mvvm,只要你在绑定数据的时候,觉着别扭。所以对数据重整了,其实都是mvvm

  包括 list<T>.Select(p=>sex=p.sex==1?"男":"女");

  包括 list<T>.select(p=>new 莫个实现了这个界面绑定接口的class(p));

  包 ClassA.cast<ClassB>()

所以每次看见这些所谓的MVVM我就想笑啊,你平时都做啥了,上面这些数据重整过程你平时没做过??还需要专门跟人讲要MVVM啊,要把Model变成ViewModel啊 --------------------编程问答--------------------
引用 36 楼 wanghui0380 的回复:
呵呵,又来了

我来吐槽把,别跟我mvvm了

其实你每天都在mvvm,只要你在绑定数据的时候,觉着别扭。所以对数据重整了,其实都是mvvm

  包括 list<T>.Select(p=>sex=p.sex==1?"男":"女");

  包括 list<T>.select(p=>new 莫个实现了这个界面绑定接口的class(p));

  包 ClassA.cast<C……


Dude, it's irrelevant. But anyway, thank you for the reply. I'm not MVVM to you. I'm MVVM to those who're interested. Of course this is not your appetite. So... what can I say --------------------编程问答--------------------
引用 36 楼 wanghui0380 的回复:
呵呵,又来了

我来吐槽把,别跟我mvvm了

其实你每天都在mvvm,只要你在绑定数据的时候,觉着别扭。所以对数据重整了,其实都是mvvm

  包括 list<T>.Select(p=>sex=p.sex==1?"男":"女");

  包括 list<T>.select(p=>new 莫个实现了这个界面绑定接口的class(p));

  包 ClassA.cast<C……


Look, I don't really mind if you post some opposite opinions, but what you've posted above is just nonsense (no offence). Can you explain why list<T>.Select(p=>sex=p.sex==1?"男":"女") is MVVM? I don't see any relevance between this code snippet and so-called 'MVVM'. Actually, MVVM is nothing new (data binding has been existing for a long long time in .NET); however, before XAML, it'd never felt so good to use. --------------------编程问答-------------------- 我刚看了你前面两个帖子

看到很多这样的言论“WPF与MVVM” 看到“Winform,asp.net不能MVVM”

先说第一条把,其实有关这块内容微软早就出来了,Binding,BingingSource,BingingList<T>,InotifyPorpertyChanged这些玩意打一开始就存在,根本不是现在才出来的东西,早在06年其实就有专门的书籍来讲解了

《Windows Forms 2.0数据绑定--.NET智能客户端数据应用程序设计》
 英文原名;Data Binding with Windows Forms 2.0: Programming Smart Client Data 

这本书在amazon评级4星半,国内评价比较低只有3星,这本书当年在国内的反响并不好,因为这里有个误区,大多数人认为,这块内容就是给强类型数据集用地,就是给微软自己的sqlDatasource打广告滴。其实作者的本意实际恰恰就是你们号称的MVVM,打造自己的场合性打智能化的数据绑定过程。所以你们把“WPF和MVVM”强挂起来的观念就不存在了


==============================

在来说第二条,有关asp.net里面不能MVVM,我们都知道treeview和meun菜单都可以支持sitemap和xml数据,可以直接绑定数据源。但是我们在绑定自己的数据源的时候,却不行。微软会告诉你没有实现一个带层级数据接口的数据源。那么如果说们在对外提供这些场合性数据源的时候,能不能把数据重整一下直接实现这个接口,让treeview自己绑定以避免让程序员去递归实现?这完全可以做到。所以所谓的asp.net没有MVVM的言论也不存在了 --------------------编程问答--------------------
引用 39 楼 wanghui0380 的回复:
我刚看了你前面两个帖子

看到很多这样的言论“WPF与MVVM” 看到“Winform,asp.net不能MVVM”

先说第一条把,其实有关这块内容微软早就出来了,Binding,BingingSource,BingingList<T>,InotifyPorpertyChanged这些玩意打一开始就存在,根本不是现在才出来的东西,早在06年其实就有专门的书籍来讲解了

《Windo……


Forget about my previous posts... I didn't have a good attitude to accept the different opinions in those, which is my fault. I never said MVVM ONLY works with WPF, please refer to this: "我还是以WPF+MVVM的本地桌面程序为背景,这样一来我们可以不去操心服务器那部分的事情,更加专注我们的MVVM". I post this stuff for free because many people are keen to learn WPF, and MVVM is not a bad start for learning that.

By the way, I don't work on ASP.NET. When it comes to web application, I love using simple PHP or Silverlight.

I said MVVM is just a thought, and you also can apply it in Winform, but usually we use the word MVP (Model-View-Presentation). For asp.net, isn't that we have MVC? --------------------编程问答--------------------
引用 40 楼 ktei2008 的回复:
引用 39 楼 wanghui0380 的回复:

我刚看了你前面两个帖子

看到很多这样的言论“WPF与MVVM” 看到“Winform,asp.net不能MVVM”

先说第一条把,其实有关这块内容微软早就出来了,Binding,BingingSource,BingingList<T>,InotifyPorpertyChanged这些玩意打一开始就存在,根本不是现在才出来的东西,……


As for this (what you said): "所以你们把“WPF和MVVM”强挂起来的观念就不存在了", I don't think I did this... But honestly, WPF or Silverlight works very well with MVVM, which I don't think we should deny? --------------------编程问答--------------------
引用 39 楼 wanghui0380 的回复:
我刚看了你前面两个帖子

看到很多这样的言论“WPF与MVVM” 看到“Winform,asp.net不能MVVM”

先说第一条把,其实有关这块内容微软早就出来了,Binding,BingingSource,BingingList<T>,InotifyPorpertyChanged这些玩意打一开始就存在,根本不是现在才出来的东西,早在06年其实就有专门的书籍来讲解了

《Windo……


And in fact, I don't understand your point. What's the harm to you if I'm here to teach MVVM to those interested guys. If you think MVVM is too shitty to be told, then I'll probably need to change the title of this post to 'M***, not a bad way for WPF starters'? Pal, it's true that you're free to speak anything (not entirely in China though) on internet, but I'm just unable to comprehend why you're here, in this post?? --------------------编程问答-------------------- 我们之所以出来说只是澄清一下“MVVM”并不是一个特别特别需要大做文章的东西

在很多年以前,程序员们其实就已经在使用这套东西了

Binding b=new Binding("Text",datasource,"xxx")
b.Parse+=xxx
b.Format+=xxxx

这样的代码在10年的winform程序员界就已经这么做了。同样把数据重整这块东西我们一样在做。这坛子里有人自己搞了一个Itreeview接口,然后在自己的数据绑定前,临时转换为一个实现了Itreeview接口的对象列表,这种手段同样也是一个十分普遍化的操作

当然我也承认,在很多不是很明白Bind过程的人手上,他们不会使用Bindingsource,binding这些东西,而是在各个事件里手动处理这个过程,微软现在只是强烈建议使用Binding过程来标准化这样的操作。也就如此而已。 --------------------编程问答--------------------
引用 43 楼 wanghui0380 的回复:
我们之所以出来说只是澄清一下“MVVM”并不是一个特别特别需要大做文章的东西

在很多年以前,程序员们其实就已经在使用这套东西了

Binding b=new Binding("Text",datasource,"xxx")
b.Parse+=xxx
b.Format+=xxxx

这样的代码在10年的winform程序员界就已经这么做了。同样把数据重整这块东西我们一样在做。这坛……


I agree with you on this point. MVVM is just a fancy name for old school way of data binding, yet it's not a bad idea to learn this, simply because there are many great frameworks for MVVM that help developers be much more productive. I still need to say: there are many new stuffs in MVVM, maybe not the thought, but the approaches. I see some developers still developing WPF in heavy event-driven way, and that's why I posted this. --------------------编程问答-------------------- I've known that this.Lord treat different opinion is so DOOG attitude --------------------编程问答-------------------- Do you think that other people is Sarpi?
you have been the greatest one! --------------------编程问答--------------------
引用 43 楼 wanghui0380 的回复:
我们之所以出来说只是澄清一下“MVVM”并不是一个特别特别需要大做文章的东西

在很多年以前,程序员们其实就已经在使用这套东西了

Binding b=new Binding("Text",datasource,"xxx")
b.Parse+=xxx
b.Format+=xxxx

这样的代码在10年的winform程序员界就已经这么做了。同样把数据重整这块东西我们一样在做。这坛子……


的确你说的绑定这些winform和asp.net都有,而且我们都用过,但是,WPF/SL中数据绑定对于模板化的控件来说有着更多的意义,比如你在ListBox控件的ItemTemplate模板中加入了一个可折叠控件Expander,而同时Expander控件中包含一个Datagrid,如果这时你需要查找ListBox中某一条记录,然后判断Expander是否展开,如果展开然后查找Datagrid中某一行记录某一行单元格,将该单元格背景设置为红色;显然Winform中绑定是不能完成这个功能的,而需要遍历查找控件来实现;WPF完全可以通过绑定来实现,因为不光是数据源可以绑定,控件的属性也可以绑定,甚至事件也可以Command绑定,这样对ViewModel中数据的操作就跟操作控件一样,从而达到界面设计和后台代码的分离 --------------------编程问答--------------------
引用 36 楼 wanghui0380 的回复:
呵呵,又来了

我来吐槽把,别跟我mvvm了

其实你每天都在mvvm,只要你在绑定数据的时候,觉着别扭。所以对数据重整了,其实都是mvvm

  包括 list<T>.Select(p=>sex=p.sex==1?"男":"女");

  包括 list<T>.select(p=>new 莫个实现了这个界面绑定接口的class(p));

  包 ClassA.cast<Cl……


正所谓存在即合理,Codeplex上那么多Mvvm开源框架,包括msdn也有专门的Prism专题,不是大家都吃饱了撑着才来搞这个的,别人分享点东西又不是什么坏事,用不着这样 --------------------编程问答--------------------
引用 47 楼 duanzilin 的回复:

既然是MVVM,就可以应用在任何地方,不管他是winform还是asp.net,
MVC中叫做:CreateView,UpdateView和UpdateModel,
是控制器的职责 --------------------编程问答--------------------
引用 49 楼 microtry 的回复:
引用 47 楼 duanzilin 的回复:

既然是MVVM,就可以应用在任何地方,不管他是winform还是asp.net,
MVC中叫做:CreateView,UpdateView和UpdateModel,
是控制器的职责


Winform和asp.net的绑定跟wpf/sl还是有本质区别的,Winform再怎么设计,他必须有后台设计代码,因为winform无法对控件属性进行直接绑定的,要设置控件属性必须首先得到控件引用,而在wpf/sl中是可以不需要获得控件引用,通过绑定就可以实现了,因此ViewModel中可以不用关心操作界面的哪个控件的哪个属性,而只要操作ViewModel的属性的属性就可以了 --------------------编程问答--------------------
引用 47 楼 duanzilin 的回复:
的确你说的绑定这些winform和asp.net都有,而且我们都用过,但是,WPF/SL中数据绑定对于模板化的控件来说有着更多的意义,比如你在ListBox控件的ItemTemplate模板中加入了一个可折叠控件Expander,而同时Expander控件中包含一个Datagrid,如果这时你需要查找ListBox中某一条记录,然后判断Expander是否展开,如果展开然后查找Datagrid中某一行记录某一行单元格,将该单元格背景设置为红色;显然Winform中绑定是不能完成这个功能的,而需要遍历查找控件来实现;WPF完全可以通过绑定来实现,因为不光是数据源可以绑定,控件的属性也可以绑定,甚至事件也可以Command绑定,这样对ViewModel中数据的操作就跟操作控件一样,从而达到界面设计和后台代码的分离


你说的这一串操作90%在winform里面都是一样支持的

因为在winform里面其Bindding对象也并是简简单单的那么一点格式化,转换功能

在winform里面对于绑定在同一个数据源的对象,其本身就会有你们wpf里面那种自动同步更新数据的功能

同样Bindding对象也可以一样对控件属性进行绑定。

那10%的差别主要在事件也可以Command绑定,这个在winform里不太好,那个要求数据源本身的去实现ISupportInitializeNotification交互依赖接口。 --------------------编程问答-------------------- 另外现在之所以MVVM火爆,那是因为一直到现在人们才发现数据绑定可以这么玩

就像我前面说滴,06年那本书出来的时候,已经可以这么玩了,只是到现在会这么玩的人并不多。甚至很多人都还以为winform里面就不能这么玩 --------------------编程问答-------------------- 这个就像ajax,ajax这概念出来以前其实也是这么玩

只是等到ajax正式被提出来以后,后面的人才反应过来原来可以如此啊,所以ajax火爆了。

但是对ajax态度我们其实也一个故事,你自己真的以为那个东西有这么神奇么,其实也没有那么夸张,有个ajax框架不错,能简化操作,统一标准没问题。只是他原本就没那么神秘,更不是什么非常非常超级的技术 --------------------编程问答--------------------
引用 51 楼 wanghui0380 的回复:


正如你提到的winform/asp.net中的绑定:

Binding b=new Binding("Text",datasource,"xxx")
b.Parse+=xxx
b.Format+=xxxx



使用wpf之前,我也有过这么做,但事实上在后台写绑定代码已违反了mvvm界面与逻辑代码分离的初衷,wpf/sl更像asp.net,它有自己的界面语言,界面实现只需要xaml加上DataContext绑定就可以了,xaml.cs中可以不用任何代码。不是说winform和asp.net不能实现mvvm,我想实现起来那将是件吃力不讨好的事情,想想要绑定到对象的子属性 Text = "{Binding Product.ProductName}",该如何实现?如果当前控件属性要绑定到其他控件的某个属性 Foreground = "{Binding Text,ElementName=textbox1}",又该如何实现呢;更关键的是,绑定源继承的问题,也就是说为窗体设置绑定源,窗体中任何子控件都可以使用该绑定源,这在层次化界面中尤其重要;如此等等

winform、asp.net、wpf/sl我都用了不少时间了,mvvm原本就是从mvc、mvp这些winform/asp.net框架发展而来的,最终wpf/sl选择使用mvvm肯定不是巧合的,而没人在asp.net/winform中使用mvvm框架也是同样的原因 --------------------编程问答--------------------
引用 54 楼 duanzilin 的回复:
而没人在asp.net/winform中使用mvvm框架也是同样的原因

是你没见过,都跟你说了,双向绑定本身就是视图控制器的职责,
实际上,MVC中的V指的就是ViewModel,而view是不过是个容器,设计时刻是空的甚至是不存在的
视图模型and视图控制器确实是UI平台相关的,
但是每个UI平台都对应着它们专有的视图模型和控制器的实现

另一方面,很多人喊着MVVM和MVC的口号,而实际上代码根本就不是面向对象的设计,
总不能起个时髦的名字,就可以指鹿为马吧
--------------------编程问答-------------------- 回复54楼

这个并不是wpf或者MVVM的功劳,你说的这个形式上不用写cs的功能其实是编译器的功劳。当然如果说我们对编译器提供一个扩展,比如codeproject上很多老外对xml文件提供了扩展。你写一个
<a>
 <b name="xx"/>
 </a>
在vs里就可以直接在编译时候编译成对应的对象,甚至你还可以在设计器直接在vs ide里用 a.b.name去访问到值,所以这并不是一个需要特别强调的东西。只要你自己愿意扩展他,就是直接在现有winform里用你这种方式给winfom控件绑定也并不是没有可能。


======================================================================
想想要绑定到对象的子属性 Text = "{Binding Product.ProductName}",该如何实现

这个在winform里面是一样的过程 new Binding("Text",datasouce,"Product.ProductName")
当然有时候我们会使用第二个数据源源

Bingdingsouce b2=new Bindingsource()
b2.datasource=datasouce
b2.member="Product"
new Binding("Text",b2,"ProductName")


================================================
如果当前控件属性要绑定到其他控件的某个属性 Foreground = "{Binding Text,ElementName=textbox1}",又该如何实现呢

这个也就是我上面说的10%的弱项,因为这需要交互初始化过程



ps:
http://blog.csdn.net/hertcloud/article/details/1587233

来看一下这个,这些都是在net2下就已经存在的数据绑定接口
 
他们原本就存在,包括你们现在MVVM下实际也都在自己去搞这些接口的实现包括你们上面提的
IRaiseItemChangedEvents
INotifyPropertyChanged 

但是在当年人们根本就不研究他们,不管在博客园还是这里,我们很少看到有人去讨论他们,也就是你们现在MVVM了用到了他们,才猛然发现,哦,原来还有这么多和数据绑定相关的接口




--------------------编程问答-------------------- 缪军兄弟说对了,其实这块内容都是一些界面技巧。基本和OO没关系了,微软怎么规定数据绑定接口,我们就怎么实现那些接口,而且这些接口都是场合性的都是和具体UI关联的玩意。假如没有UI,自己去搞这块都比较多余,所以微软才提MVVM===model是model和UI无关,ViewModel是ViewModel和场合UI有关系,所以你去实现那些数据绑定接口把 --------------------编程问答--------------------
引用 55 楼 microtry 的回复:
引用 54 楼 duanzilin 的回复:
而没人在asp.net/winform中使用mvvm框架也是同样的原因
是你没见过,都跟你说了,双向绑定本身就是视图控制器的职责,
实际上,MVC中的V指的就是ViewModel,而view是不过是个容器,设计时刻是空的甚至是不存在的
视图模型and视图控制器确实是UI平台相关的,
但是每个UI平台都对应着它们专有的视图模型和控制器的实现
……


呵呵,我的意思是:不同开发平台下使用哪个框架最方便就用哪个,并没有说winform/asp.net不能用mvvm,至于哪个平台使用什么框架最方便,使用过的人体会最深刻,我做wpf/sl项目只用mvvm,虽然也可以用mvc或mvp,但显然mvvm框架是最好用的;而做asp.net我会用mvc,很期待有人能写个好用asp.net mvvm框架 --------------------编程问答--------------------
引用 56 楼 wanghui0380 的回复:
回复54楼

这个并不是wpf或者MVVM的功劳,你说的这个形式上不用写cs的功能其实是编译器的功劳。当然如果说我们对编译器提供一个扩展,比如codeproject上很多老外对xml文件提供了扩展。你写一个
<a>
 <b name="xx"/>
 </a>
在vs里就可以直接在编译时候编译成对应的对象,甚至你还可以在设计器直接在vs ide里用 a.b.name去访问到值,所以这并不……


是的,是可以实现,但是需要扩展,有必要吗?

而且最重要的一点你没有提到,关于DataContext继承的问题,界面是有很多层次的,包括各种Panel,用户控件,而且还有模板化控件是动态生成的,这些都没办法每个都设置绑定的,而需要从父控件继承过来,我想你们也会说可以实现,是的,当然可以实现,微软已经实现了,我的意思还是一样,根据需要选择自己框架,搞不懂为什么LZ就发一个mvvm的帖子,为什么这都会有人喷…… --------------------编程问答-------------------- 建议以后关于WPF/SL以及mvvm交流的帖子,还是发到Silverlight专区比较好,或者发到SilverlightChina去,学习也是需要一个良好的环境的,在这里总会有人喷的 --------------------编程问答--------------------
引用 60 楼 duanzilin 的回复:
建议以后关于WPF/SL以及mvvm交流的帖子,还是发到Silverlight专区比较好,或者发到SilverlightChina去,学习也是需要一个良好的环境的,在这里总会有人喷的

说了白天,你的意思还不是和我们一样,认为不适合大众性的讨论,只适合圈子里的讨论

其实和我们的意思一样,如果js版那里,出来一个把ext或者ajax搞的和神话一样的人,然后出来说ext,ajax如何如何怎么样,然后接着说我不过是讨论一下,交流一下,你认为会是啥效果。效果和这里一样一样一样滴 --------------------编程问答-------------------- 说实话,这里应该真正讨论的东西是被你们否掉的一个玩意“MEF”

这个才是真正值得我们讨论的东西

有关数据绑定这块内容,或者mvvm这块内容讨论的意义不大,因为就像我前面说滴,没wpf存在的时候,我们也这么玩,有他我们还是这么玩。他并没有带来我们观念上的更改

相反MEF这东西,将会产生观念上本质提升,就像版主非常喜欢linq,因为linq在c#里出现引发的neter观念上的革命不下于“lisp”对编程语言的革命一样

同样MEF这玩意将会是另外一个“linq”,这东西也将革命性的改变neter的观念 --------------------编程问答--------------------
引用 56 楼 wanghui0380 的回复:
回复54楼

这个并不是wpf或者MVVM的功劳,你说的这个形式上不用写cs的功能其实是编译器的功劳。当然如果说我们对编译器提供一个扩展,比如codeproject上很多老外对xml文件提供了扩展。你写一个
<a>
 <b name="xx"/>
 </a>
在vs里就可以直接在编译时候编译成对应的对象,甚至你还可以在设计器直接在vs ide里用 a.b.name去访问到值,所以这并……


我本来很不想再卷入口水战,但是我不得不说:您能否再多读点书,然后再来说点有实践意义的话?你洋洋洒洒这么多字,我都不知道你到底想表达什么,是表达你的不屑?是表达你不满MVVM的存在?我甚至不知道你那故作老成,看透一切,“哥好几年前就玩够了这些”的优越感是从何而来…… --------------------编程问答--------------------
引用 62 楼 wanghui0380 的回复:
说实话,这里应该真正讨论的东西是被你们否掉的一个玩意“MEF”

这个才是真正值得我们讨论的东西

有关数据绑定这块内容,或者mvvm这块内容讨论的意义不大,因为就像我前面说滴,没wpf存在的时候,我们也这么玩,有他我们还是这么玩。他并没有带来我们观念上的更改

相反MEF这东西,将会产生观念上本质提升,就像版主非常喜欢linq,因为linq在c#里出现引发的neter观念上的革命不……


相反,我不觉得MEF有什么好讨论的。说实话,从你的观点出发,我觉得讨论任何东西都没有什么价值,我们不如来比谁挣的多实际点。还有就是,如果你这么反感,有这么多意见,你可以不再这个帖子里出现,你已经占领帖子里很多地方了。我相信还是有感兴趣,想学习的朋友的,你觉得这个东西没啥可讲的,你可以到其他地方去,但是你偏要走出来当三个代表。 --------------------编程问答--------------------
引用 58 楼 duanzilin 的回复:
引用 55 楼 microtry 的回复:
引用 54 楼 duanzilin 的回复:
而没人在asp.net/winform中使用mvvm框架也是同样的原因
是你没见过,都跟你说了,双向绑定本身就是视图控制器的职责,
实际上,MVC中的V指的就是ViewModel,而view是不过是个容器,设计时刻是空的甚至是不存在的
视图模型and视图控制器确实是UI平台相关的,
但是每个UI……

我不知道为什么CSDN是这样的,我去国外的板块很少碰到这种情况,我很难明白知识分享讨论贴会落得这种下场。 --------------------编程问答-------------------- 问题是你在分享撒子

如果你去js版,去跟他们分享ext,号召大家努力学习ext,ext前程远大。这个和你现在所做的事情是一样滴

因为原生js的人说,你和我们做的本来就是一样的事情。1不能改变我的编程观念,2我们原生js用的手段其实和你们ext的手段基本就是一模一样滴


就像版主前几天和人为了linq打口水帐一样,why,因为linq改变了c#的观念

同样你这里mvvm基本没改变任何观念,本来我就这么做滴,你不过换了一个形式

ps:MEF实际上把代码编织和面状编程引入了进来,这将根本性改变你的编程观念,包括你们这些MVVM的人,因为你也正在为view头疼,你也需要把纵向设计的对象横向联合起来,所以这手段将是一个非常重要的东西 --------------------编程问答--------------------
引用 66 楼 wanghui0380 的回复:
问题是你在分享撒子

如果你去js版,去跟他们分享ext,号召大家努力学习ext,ext前程远大。这个和你现在所做的事情是一样滴

因为原生js的人说,你和我们做的本来就是一样的事情。1不能改变我的编程观念,2我们原生js用的手段其实和你们ext的手段基本就是一模一样滴


就像版主前几天和人为了linq打口水帐一样,why,因为linq改变了c#的观念

同样你这里mvvm基……


我不是“MVVM的人”,我在澳洲的微软部门工作,我在WPF开发组,我的工作就是WPF开发,所以我深知这里面的一些技巧。我想我首先有权利在这里发帖,二是我有资格。你的开发,用什么手段,用什么工具,那是你的事了。其实我没觉得你的看法有多么正确,里面有许多漏洞,但是我何必费劲来一个个点破呢? --------------------编程问答-------------------- 这不就露底了,原来你是过来搞产品推广滴

ok,那你就推广好了。但是就算你是搞推广滴,也不能不允许俺们说“其实那个把群英荟萃,就是萝卜开会” --------------------编程问答--------------------
引用 66 楼 wanghui0380 的回复:
MEF实际上把代码编织和面状编程引入了进来,这将根本性改变你的编程观念,包括你们这些MVVM的人,因为你也正在为view头疼,你也需要把纵向设计的对象横向联合起来,所以这手段将是一个非常重要的东西

我觉得你需要改变的不仅是编程观念了。还有,别随便给别人扣帽子,什么叫“你们这些MVVM的人”,这本身是个什么定义?我从来没有为View头疼过,因为有太多工具,框架,理念可以解决这个问题,我只需要选择最顺手的即可。我没有吹捧MVVM的意思,其实微软提供了这么多途径,为了达到业务需求,随便你怎么玩。我只是觉得MVVM是个不错的模式,nothing fancy, nothing revolutionary, but good to know for those who've no idea, okay? --------------------编程问答-------------------- 同时我也不说啥了,既然你自己号称是微软部门工作滴,号称是我在WPF开发组滴,那么你自己就应该知道这块东西本来90%靠的就是net2的那几个原来就有数据绑定接口

就兴你们能在这个几个数据绑定接口玩出花来,不不兴别人能长点草?? --------------------编程问答--------------------
引用 68 楼 wanghui0380 的回复:
这不就露底了,原来你是过来搞产品推广滴

ok,那你就推广好了。但是就算你是搞推广滴,也不能不允许俺们说“其实那个把群英荟萃,就是萝卜开会”


呵呵,兄弟,我可以这么说说,你就算了吧。 --------------------编程问答--------------------
引用 70 楼 wanghui0380 的回复:
同时我也不说啥了,既然你自己号称是微软部门工作滴,号称是我在WPF开发组滴,那么你自己就应该知道这块东西本来90%靠的就是net2的那几个原来就有数据绑定接口

就兴你们能在这个几个数据绑定接口玩出花来,不不兴别人能长点草??

我很怀疑你用过WPF没?或者你真的会用吗?你一直张口闭口谈数据绑定,你只知道数据绑定?好吧,如果让你开发WPF,你有更好的模式或理念,你可以一边偷着乐了。你就慢慢长草吧…… --------------------编程问答--------------------
引用 70 楼 wanghui0380 的回复:
同时我也不说啥了,既然你自己号称是微软部门工作滴,号称是我在WPF开发组滴,那么你自己就应该知道这块东西本来90%靠的就是net2的那几个原来就有数据绑定接口

就兴你们能在这个几个数据绑定接口玩出花来,不不兴别人能长点草??


你能解释一下你的90%这个数字是怎么得出来的吗?你看似这么了解,可是你都是一知半解。 --------------------编程问答-------------------- 太可笑了,wpf/sL/wp7都不属于C#语言的范畴了?不能在这讨论?主要是CSDN没有WPF板块,所以才有人在这里发帖。另外没有人否定MEF,我只是说MEF不是每个项目必须的,有需要的时候在原有框架上扩展就可以了,难道是个项目就要把MEF搞进来,真的怀疑你对MEF了解多少。我看是这里有些人只认可自己掌握的技能,对于WPF等技术这些持排挤态度,其实不光在mvvm的讨论,翻一下以前的帖子,会发现他们对于wpf的讨论也是如此,这些与他们现在的掌握技术没有交集,所以他们就抨击这些技术,而MEF和Linq属于.net Framework框架层面的技术,与是wpf/sl还是winform是没有关系的,所以他们拿这个来说事,事实上没有人否定这些,因为linq是最常使用到的技术了,有必要拿到这个帖子里来讨论吗?显得自己水平高?就算你现在水平多高,学习一点新的东西不好吗?就算你不屑,也没必要抨击别人,打击别人的积极性,CSDN是学习交流的地方,况且这个帖子也没越界,有必要这样吗? --------------------编程问答-------------------- 我请求某些大神们……放过我吧 --------------------编程问答-------------------- 没想到这贴子又快沦为口水战了……这是在是。。。情何以堪啊 --------------------编程问答--------------------
引用 59 楼 duanzilin 的回复:
搞不懂为什么LZ就发一个mvvm的帖子,为什么这都会有人喷

楼主对待不同意见的恶劣态度导致了最后的不理智的口水仗和人身攻击,
别的不说,仅仅是这个帖子,你仔细阅读楼主包括英文在内的回复也不难看出 --------------------编程问答-------------------- WPF的窗口也是 Win32的 Window句柄。
--------------------编程问答--------------------
引用 77 楼 microtry 的回复:
引用 59 楼 duanzilin 的回复:
搞不懂为什么LZ就发一个mvvm的帖子,为什么这都会有人喷

楼主对待不同意见的恶劣态度导致了最后的不理智的口水仗和人身攻击,
别的不说,仅仅是这个帖子,你仔细阅读楼主包括英文在内的回复也不难看出

在这个帖子里,我不觉的我有什么拙劣的地方,如果有,你举个例子吧。我不觉得“不难看出”,我觉得“很难看出” --------------------编程问答-------------------- Could you explain the difference between MVVM and MVC? --------------------编程问答--------------------
引用 75 楼 ktei2008 的回复:
我请求某些大神们……放过我吧
没想到这贴子又快沦为口水战了……这是在是。。。情何以堪啊

你可以看看CSDN的技术帖子,就算是分享观点和代码的,
出现不同观点或反对声音不在少数吧 --------------------编程问答--------------------
引用 54 楼 duanzilin 的回复:
引用 51 楼 wanghui0380 的回复:


正如你提到的winform/asp.net中的绑定:
HTML code

Binding b=new Binding("Text",datasource,"xxx")
b.Parse+=xxx
b.Format+=xxxx




使用wpf之前,我也有过这么做,但事实上在后台写绑定代码已违反了mvvm界面与逻辑代码分离的初衷……


感谢你回答这个问题。我完全同意你说的,他说的这种绑定恰巧是个反例,是一种“恶劣”(说恶劣太过了)的绑定。MVVM只是利用XAML灵活强大的数据绑定来实现界面与逻辑的低耦合,以便于快速测试,调试。而这个绑定的例子反而把显示层和逻辑层又粘起来了。 --------------------编程问答--------------------
引用 81 楼 microtry 的回复:
引用 75 楼 ktei2008 的回复:
我请求某些大神们……放过我吧
没想到这贴子又快沦为口水战了……这是在是。。。情何以堪啊

你可以看看CSDN的技术帖子,就算是分享观点和代码的,
出现不同观点或反对声音不在少数吧

所以在这个互联网时代,很多人不表达一下自己的观点就不痛快,尽管那里根本没他什么事儿。 --------------------编程问答-------------------- MVVM使用XAML???
MVVM怎么会知道XAML的存在???
--------------------编程问答-------------------- 为什么变成口水,是因为你在不负责任滴推广。

你要推广WPF我们绝不反对,毕竟那是个好东西。xaml是好东西,硬件级渲染是好东西,wp7是好东西。

问题在于你非要扯个MVVM的幌子

如果说MVVM,我举个例子,Array.sort,因为sort排序需要 IComparer接口,如果原始array的 IComparer不存在或者不是我想要滴,我们可以自己生成一个临时性的带IComparer接口的并且是我想要的比较方法新array,丢给Array.sort

这就是典型的MVVM,一个不带 IComparer 的model 被 转换成了 一个带IComparer接口的ViewModel,并且被Array.sort这个算法容器给正确识别并运算了

那么Array.sort这东西和WPF有关系吗?没有任何关系,但他是MVVM的表达

=======================================================

为啥我们从头到尾的反对,很简单。因为我们很烦啊,因为那些不负责任的乱推广,引起的混乱,到现在都很难平息啊

不管是caozhy版主,还是缪军兄弟,还有坛子里几个老家伙都不止一次在说

“linq 不是linq2sql“
“linq不是ORM”
“ORM不是业务实体”
“设计模式不是GOF23“
“MVC 不是asp.net mvc"

========

如果按lz这种推广方式,以后版主就要多一个任务了“MVVM 不是WPF MVVM“

--------------------编程问答-------------------- 还有“分层不是petshop” --------------------编程问答--------------------
引用 81 楼 microtry 的回复:
引用 75 楼 ktei2008 的回复:
我请求某些大神们……放过我吧
没想到这贴子又快沦为口水战了……这是在是。。。情何以堪啊

你可以看看CSDN的技术帖子,就算是分享观点和代码的,
出现不同观点或反对声音不在少数吧


我说句心里话:我分享这些东西,纯粹是因为我本身非常喜欢编程,对这些技术很感兴趣,所以有什么我个人觉得比较不错的技术出现以后,我觉得很兴奋,不分享不痛快,如此而已。没错,我前一篇的帖子对不同意见态度很恶劣,因为我觉得很来气:明明是分享点知识,有些人却觉得莫名其妙的来砸场子,所你你来砸,我就砸你。但是现在我觉得无所谓了,其实有很多朋友还挺感兴趣的,所以我还是想尽量能写完这个东西。

我看过你的一些回复(抱歉我在上一篇贴子中对你的恶劣态度),我觉得你基本上是.NET老手了,所以有些东西你觉得理所当然,稀松平常,那是必然的。但是有许多人用着WPF,却一个劲的添加各种事件到后台代码里,我看见了都着急,这也是我分享这个的一个原因。

至于MVVM,它就是一个缩写而已。我没有否定其他任何模式,我只是个人觉得WPF/Silverlight,包括WP7,用MVVM是首选之一。 --------------------编程问答--------------------
引用 83 楼 ktei2008 的回复:
所以在这个互联网时代,很多人不表达一下自己的观点就不痛快,尽管那里根本没他什么事儿。

这是你真实意思的表达,你在本帖中已经用英文表达过了,
但是你感谢别人的回复就说的虚伪了,这就好比我说:
"伙计,你的这个帖子和MVVM有关系吗?不过,还是非常支持楼主分享"
不过,我这到是我的真心话,你说的名词都是MVVM,可是几乎没有MVVM的理儿,更没有MVC的理儿

我顺便把80楼的话儿改一下:
would you like to explain the differences and relations of MVVM and MVC? --------------------编程问答--------------------
引用 85 楼 wanghui0380 的回复:
为什么变成口水,是因为你在不负责任滴推广。

你要推广WPF我们绝不反对,毕竟那是个好东西。xaml是好东西,硬件级渲染是好东西,wp7是好东西。

问题在于你非要扯个MVVM的幌子

如果说MVVM,我举个例子,Array.sort,因为sort排序需要 IComparer接口,如果原始array的 IComparer不存在或者不是我想要滴,我们可以自己生成一个临时性的带IComp……


你真是来无理取闹的。我有说过XAML=MVVM吗?

“还有坛子里几个老家伙都不止一次在说”——什么叫坛子里的老家伙?什么坛子?

Array.Sort跟MVVM?你快算了吧。

先生,你如果真的懂,你就不屑的离开;如果你一知半解,请你多读书;如果你不知道还在这里扯一些云里雾里的东西……唉。

我感觉你是来这里叫嚣你的不满的:什么“分层不是petshop”。。。。这都是哪跟哪。我初以为你真的懂点东西,现在觉得你也就只能是个坛子里的老家伙了。 --------------------编程问答-------------------- 起码别人愿意分享。
还真就不怎么喜欢只会批判别人的错误,又不愿意给正确例子的人。 --------------------编程问答-------------------- 有点到疼脚了,唉

sorry,我已经很小心了 --------------------编程问答--------------------
引用 90 楼 karascanvas 的回复:
起码别人愿意分享。
还真就不怎么喜欢只会批判别人的错误,又不愿意给正确例子的人。


唉,正确的例子已经给了无数遍了,MVVM 不是WPF MVVM ,如果你们要宣扬,要推广!麻烦请加上定语 或修饰  --------------------编程问答--------------------
引用 88 楼 microtry 的回复:
would you like to explain the differences and relations of MVVM and MVC?


我就是再说的天花乱坠又如何?我觉得我就直接说“我不知道吧”,我不知道。我不需要来这里证明我知道这个或知道那个。有些人就可怜到不让别人觉得自己是高手,自己那可怜的自尊就没处搁,我很同情。

前面有个人说什么坛子里的老家伙,我不知道他这话什么意思,貌似他把你也算进去了。我无所谓有多少所谓的老家伙过来反对,我只是在分享而已。 --------------------编程问答--------------------
引用 90 楼 karascanvas 的回复:
起码别人愿意分享。
还真就不怎么喜欢只会批判别人的错误,又不愿意给正确例子的人。


你们整个都没看清楚,包括前面那几个捧场,其实真正想看的是MVVM在WPF这个特性修饰语下的实现,而不是是啥跟我学MVVM,与其说ls几位是跟他学MVVM,不如说是看lz做WPF实例 --------------------编程问答--------------------
引用 92 楼 wanghui0380 的回复:

兄弟,那个86866...你懂的 --------------------编程问答-------------------- 为什么我反对,因为他把这个修饰给抹掉了

就好像你想学linq结果人家把linq2sql的2sql给抹掉了,你觉着你学的还是linq吗? --------------------编程问答--------------------
引用 92 楼 wanghui0380 的回复:
引用 90 楼 karascanvas 的回复:
起码别人愿意分享。
还真就不怎么喜欢只会批判别人的错误,又不愿意给正确例子的人。


唉,正确的例子已经给了无数遍了,MVVM 不是WPF MVVM ,如果你们要宣扬,要推广!麻烦请加上定语 或修饰


你怎么这么……我有说过WPF MVVM吗?我的的原话“我还是以WPF+MVVM的本地桌面程序为背景……”WPF+MVVM是什么意思?说不规范点,不就是用点XAML做UI然后绑定个viewmodel吗?我通篇根本没有说MVVM就是WPF,也没有说WPF就是MVVM,我只是说MVVM是开发WPF的一种首选方式而已。 --------------------编程问答--------------------
引用 93 楼 ktei2008 的回复:

是不是我要拉个以前我的技术分享贴,让你看看放歌是怎么喷我的?
这不是很正常的嘛
帖子不就是用来讨论的么? --------------------编程问答--------------------
引用 94 楼 wanghui0380 的回复:
引用 90 楼 karascanvas 的回复:
起码别人愿意分享。
还真就不怎么喜欢只会批判别人的错误,又不愿意给正确例子的人。


你们整个都没看清楚,包括前面那几个捧场,其实真正想看的是MVVM在WPF这个特性修饰语下的实现,而不是是啥跟我学MVVM,与其说ls几位是跟他学MVVM,不如说是看lz做WPF实例

没错,我就是要做WPF的实例,这有什么不对的?难道我在这里说一些所谓的模棱两可的(就好比你那些不着边际的理论)东西就有意义了吗? --------------------编程问答-------------------- 既然你通篇篇根本没有说MVVM就是WPF

那么我们说winform下有同等实现你咋那么反感呢??

我们也没说,你wpf那个就不是mvvm,我们只是说winform下实际也有,如此而已
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,