Silverlight实用窍门系列:52.Silverlight中的MVVM框架极速入门(以MVVM Light Toolkit为例)

 在本文将以MVVM Light Toolkit为例讲解MVVM框架在现实中的使用入门,首先我们在http://mvvmlight.codeplex.com/下载它的MVVM框架下来。也可以通过 http://files.cnblogs.com/chengxingliang/GalaSoft.MvvmLight.V3.rar 下载MVVM Light Toolkit。然后我们安装这个安装包,然后重新打开VS2010,新建一个项目,如下图所示:

   Tip:MVVM分为Model、ViewMode、View三层。

        •Model是实体类层,它存放所有需要用到的实体类。

        •ViewMode层是逻辑层,操作所有Model层和View界面层的逻辑运算并且作为一个大的实体类,提供属性绑定到View层上面去。

        •View层是界面显示层,只需要它的Xaml代码去绑定相应的ViewMode层的属性即可。

        下面我们来看新建成功的项目结构如下:

        一、在这里我们先来看MainPage.xaml中的代码,在这里绑定的MainPage.xaml是View层,它绑定上了ViewModel层,也就是MainViewModel.cs类

<UserControl x:Class="MvvmLight1.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             Height="300"
             Width="300"
             DataContext="{Binding Main, Source={StaticResource Locator}}">
    <!--在这里绑定App.xaml中的静态资源,以连接MainViewModel类(ViewMode层)  MainPage.xaml代码为View层-->

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">

        <TextBlock FontSize="36"
                   FontWeight="Bold"
                   Foreground="Purple"
                   Text="{Binding Welcome}"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   TextWrapping="Wrap" Margin="12,25,20,171" />
        <Button Content="{Binding BtnContent}" Height="23" HorizontalAlignment="Left" Margin="12,178,0,0"
                Command="{Binding ShowMessage}" Name="button1" VerticalAlignment="Top" Width="75" />
        <Button Content="点我改变文字" Height="23" HorizontalAlignment="Left" Command="{Binding ChangeText}"
                Margin="187,178,0,0" Name="button2" VerticalAlignment="Top" Width="75" />
    </Grid>
</UserControl>

   二、然后我们看ViewModel层,在这里我们申明了一些string属性以绑定到View层得显示内容上,然后对于鼠标的点击事件采用Command命令传递事件和处理方法,并且设置绑定。这样我们可以直接将前台的点击事件等和后台分离,并且我们可以继承INotifyPropertyChanged接口,以让ViewModel层的属性被改变的时候,也反映到View层,在Command方法中改变ViewModel层的属性即可改变View层的前台显示。其具体的详解在下面的代码中已经给出。

using GalaSoft.MvvmLight;
using System.Windows.Input;
using GalaSoft.MvvmLight.Command;
using System.Windows;
using System.ComponentModel;

namespace MvvmLight1.ViewModel
{
    /// <summary>
    /// This class contains properties that the main View can data bind to.
    /// <para>
    /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
    /// </para>
    /// <para>
    /// You can also use Blend to data bind with the tool's support.
    /// </para>
    /// <para>
    /// See http://www.galasoft.ch/mvvm/getstarted
    /// </para>
    /// </summary>
    public class MainViewModel : ViewModelBase, INotifyPropertyChanged
    {
        public string Welcome
        {
            get
            {
                return "欢迎使用MVVM Light! ";
            }
        }

        /// <summary>
        /// 类初始化
        /// </summary>
        public MainViewModel()
        {
            _btnContent = "点击我";
            RegistCommand();
        }

        //A.对于属性的绑定
        private string _btnContent;
        public string BtnContent
        {
            set
            {
                _btnContent = value;
                NotifyPropertyChanged("BtnContent");

            }
            get
            {
                return _btnContent;
            }
        }

        //B.1申明对于点击事件的绑定
        public RelayCommand ShowMessage { get; set; }
        //使用C步骤的注册,将Command和需要运行的方法联系起来。
        private void showmsg()
        {
            MessageBox.Show("你成功的将命令绑定到界面层!");
        }

        //B.2改变界面上的控件显示文字
        public RelayCommand ChangeText { get; set; }
        //执行改变文字操作
        private void changeTxt()
        {
            BtnContent = "我已经被改变了";
        }
        //是否可以改变文字
        private bool canchangeTxt()
        {
            if (BtnContent == "点击我")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //C.对于所有的事件进行注册
        private void RegistCommand()
        {
            //C.1指定需要执行的函数showmsg()
            ShowMessage = new RelayCommand(() => showmsg());
            //先执行canchangeTxt()函数,验证是否可以改变文字,如果可以改变则执行changeTxt()函数
            ChangeText = new RelayCommand(() => changeTxt(), () => canchangeTxt());
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }
}

  三、在这里我们没有使用到Model层,它用于构造实体集合以绑定诸如DataGrid之类的控件。

        最后我们来看实例的运行效果如下,如需源码请点击 MvvmLight1.rar 下载。 

时间: 2024-12-09 09:17:31

Silverlight实用窍门系列:52.Silverlight中的MVVM框架极速入门(以MVVM Light Toolkit为例)的相关文章

Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地【附带实例源码】

在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能. 下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地. 一.在Silverlight运行界面中我们检查系统默认摄像头和麦克风是否可用如下图: 二.我们看Xaml代码如下所示: <Grid x:Name="LayoutRoot" Background="White"> <Border BorderBrush="S

Silverlight实用窍门系列:49.Silverlight中管理独立存储--Isolated Storage【附带实例源码】

Silverlight中的独立存储是其内部的可信任的可访问文件空间,在这里你可以使用Silverlight随意的创建.读取.写入.删除目录和文件,它有一些类似于Cookie,但是它可以在客户端保存大量的数据.这个空间默认是1M,如果不够的时候可以申请扩大容量. 网站+用户+应用程序定位一个独立存储,也就是说必须得相同网站,相同用户,相同应用程序才能够访问这个独立的存储空间.独立存储是IsolatedStorageFile密封类来进行设置的,这个类分布在命名空间System.IO.Isolated

Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别

 问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有使用了这个字段的控件呢?         回答:使用Element to Element Binding,将AgeFiled绑定到A控件,然后再让B.C.D.E控件绑定A控件的使用AgeField字段的属性.         例如:字段(AgeField)的数据是年龄大小,A.B.C.D.E控件分

Silverlight实用窍门系列:44.Silverlight 4.0中进行单元测试 【附带源码实例】

在Silvelight 4.0的项目中我们也需要制作单元测试以保证项目的质量,本节将讲诉如何创建一个项目进行单元测试. 一.创建一个名为SL4UnitAPP的Silverlight 应用程序,不需要Web承载网站. 二.然后鼠标右键点击SL4UnitAPP解决方案,添加一个名为SL4UnitTest的Silverlight Unit Test Application. 三.在平时VS2010 创建项目时无法添加一个Silverlight Unit Test Application,所以我们需要将

Silverlight实用窍门系列:39.Silverlight中使用Frame和Page控件制作导航【附带实例源码】

在Silverlight中有时需要进入不同的XAML页面,但是一般情况下是不能实现"前进"和"后退"的,在这里我们可以使用Frame+Page控件制作导航功能实现上一页和下一页的跳转功能. 在本文中我们制作一个实例如下:添加一个Frame控件,然后点击"加载UC"和"加载PageShow"按钮加载UC.xaml和PageShow.xaml页面.在加载后我们可以通过鼠标右键菜单中的"上一页"和"下一

Silverlight实用窍门系列:36.Silverlight中播放视频和打印文档【附带源码实例】

在silverlight实际项目中时常会需要播放视频和打印文档,在本节中我们将制作一个最简单的播放视频和打印文档的实例. 一.播放WMV视频 首先我们创建一个Silverlight应用程序SLShowVideo,然后放一个示例Wmv视频在SLShowVideo.web项目的根目录下面. 然后我们在Xaml文档中放入一个MediaElement控件,并写入以下代码: <MediaElement Height="377" HorizontalAlignment="Left&

Silverlight实用窍门系列:41.Silverlight中调用麦克风模拟录音机设备,存储为WAV音频【附带实例源码】

   在Silverlight 4中支持了麦克风设置的调用,在本节中我们将调用麦克风设备,然后进行录音,并且将录制的声音存取为Wav音频文件.         第一步.首先我们从AudioSink类派生一个音频接收器类:WavAudioSink.其代码如下所示: public class WavAudioSink:AudioSink { // 设置需要记录的内存流 private MemoryStream _stream; // 设置当前的音频格式 private AudioFormat _fo

Silverlight实用窍门系列:45.Silverlight下使用WinDbg调试应用程序和查看异常情况

在本节中我们将讲述如何通过WinDbg工具对Silverlight应用程序进行调试,我们可以判断其无效过期的引用或者事件,将其释放掉,以达到及时释放内存的作用. 首先我们需要下载WinDbg工具,在http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.402.msi即可下载32位的WinDbg工具.并且安装好这个工具. 然后我们准备一个最简单的Silverlight应用程序,其Xaml代码如下: <UserCont

Silverlight实用窍门系列:51.Silverlight页面控件的放大缩小、Silverlight和Html控件的互相操作【附带源码实例】

    本节将讲述三个Silverlight中应用的小技巧:Silverlight页面的放大缩小.Silverlight操作Html.Html操作Silverlight控件. 一.Silverlight页面的放大缩小         首先对于Silverlight页面的放大缩小我们可以使用ScaleTransform对Canvas控件进行设置.这样所有在该Canvas控件内的所有子控件都被放大缩小.         下面我们看Xaml源码如下: <Canvas MouseWheel="La