无废话WPF系列19:MVVM简单介绍

MVVM主要是为了逻辑代码和视图的分离,使CodeBehind只包含对UI的操作。通过绑定和Command来实现

image

下面我们实现一个最简单的示例,点击按钮使年龄加1.

image

XAML代码

<Window x:Class="DeepXAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DeepXAML"       
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
         xmlns:cl="clr-namespace:System.Collections;assembly=mscorlib"
        Title="MainWindow" Height="250" Width="450">
       <StackPanel>
        <TextBox Text="{Binding Path=Name}"></TextBox>
        <TextBox Text="{Binding Path=Age}"></TextBox>
        <Button Command="{Binding Path=AddAge}" >Add Age</Button>
    </StackPanel>
</Window>

 

MainPageViewModel

 public class MainPageViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string name;
        public string Name {
            get { return name; }
            set {
                name = value;
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
                }
            }
        }

        private int age;
        public int Age {
            get { return age; }
            set
            {
                age = value;
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Age"));
                }
            }
        }

        public ICommand AddAge
        {
            get { return new AddAgeCommand(this); }
        }

    }

 

 public class AddAgeCommand : ICommand
    {
        private MainPageViewModel mMainPageViewModel;
        public AddAgeCommand(MainPageViewModel model)
        {
            mMainPageViewModel = model;
        }

        public bool CanExecute(object parameter)
        {
            return true;
           
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            this.mMainPageViewModel.Age += 1;
        }
    }

 

我们可以看一下后台只有很少代码:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MainPageViewModel mainPageViewModel = new MainPageViewModel { Age = 20, Name = "Jack" };
            this.DataContext = mainPageViewModel;
        }      
    }
作者: 王德水
出处:http://www.cnblogs.com/cnblogsfans
版权:本文版权归作者和博客园共有,转载需经作者同意。

posted @ 2011-03-01 12:33 王德水 阅读(596) 评论(3) 编辑 收藏

 回复 引用 查看   
#1楼 2011-03-03 13:28 sweethome      
Model那些就不算后台代码了吗...
 回复 引用 查看   
#2楼 2011-03-04 09:55 vvGO      

后台的代码其实也可以省略掉,在后台其实只做了一件事就是给datacontext赋值为vm,这部分可以写到xaml里
1. window的resource加上:
<vm:MainPageViewModel x:Key="MainPageViewModel"></vm:MainPageViewModel>
2. 设置stackpanel的datacontext即可:
<StackPanel DataContext="{StaticResource MainPageViewModel}">

 回复 引用 查看   
#3楼 2011-07-22 08:12 翁玉礼      
引用vvGO:
后台的代码其实也可以省略掉,在后台其实只做了一件事就是给datacontext赋值为vm,这部分可以写到xaml里
1. window的resource加上:
<vm:MainPageViewModel x:Key="MainPageViewModel"></vm:MainPageViewModel>
2. 设置stackpanel的datacontext即可:
<StackPanel DataContext="{StaticResource MainPageViewModel}">

倒是不建议这样,修改的时候还是.CS中比较方便。