MVVM 学习之 生肖查询器

来源:互联网 发布:淘宝写毕业论文靠谱吗 编辑:程序博客网 时间:2024/04/26 14:24

MVVM模式学习

以前winform 入门的时候 做了个非常简单的 生肖查询器。效果如下:

最近看了些不少资料,发现MVVM模式挺好用的。

M----model  V-----view    VM-----viewmodel

具体的不说了,博客园,银光中国,很多地方都有介绍。 我个人觉得最主要用到的就是 silverlight 的绑定机制。

于是乎就想自己做个简单的MVVM例子,想了想就把生肖查询器给转换过来了

整个解决方案 的树形结构如下:

具体代码示例如下:

AnimalModel

using System;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.ComponentModel;

namespace SearchAnimals.Model

{

    public class AnimalModel : INotifyPropertyChanged

    {

            public event PropertyChangedEventHandler PropertyChanged;      

        #region Animal 私?有瓺 属?性?

        private String _Year;

        private String _Name;

        private String _Image;

        #endregion

        #region Animal 共2有瓺 属?性?

        public String Year {

            get {

                return _Year;

            }

            set {

                _Year = value;

                updata("Year");

            }

        }

        public String Name {

            get {

                return _Name;

            }

            set {

                _Name = value;

                updata("Name");

            }

        }

        public String Image {

            get {

                return _Image;

            }

            set {

                _Image = value;

                updata("Image");

            }

        }

        #endregion

        private void updata(String name)  {

            if (PropertyChanged != null) {

                PropertyChanged(thisnew PropertyChangedEventArgs(name));

            }

        }

             

    }

}

 

AnimalView.xaml

<UserControl

    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"

    xmlns:SearchAnimals_ViewModel="clr-namespace:SearchAnimals.ViewModel" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="SearchAnimals.View.AnimalView"

    mc:Ignorable="d"

    d:DesignHeight="300" d:DesignWidth="400">

    

<UserControl.Resources>

<SearchAnimals_ViewModel:AnimalViewModel x:Key="AnimalViewModelDataSource" d:IsDataSource="True"/>

</UserControl.Resources>

    

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource AnimalViewModelDataSource}}">

<Grid.RowDefinitions>

<RowDefinition Height="1*"/>

<RowDefinition Height="2*"/>

</Grid.RowDefinitions>

<Grid Grid.Row="0">

<Grid.RowDefinitions>

<RowDefinition Height="1*"/>

<RowDefinition Height="1*"/>

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="1*"/>

<ColumnDefinition Width="1*"/>

</Grid.ColumnDefinitions>

<ComboBox x:Name="comboBox" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding ListYear}" FontFamily="SketchFlow Print" FontSize="24"  HorizontalAlignment="Center" VerticalAlignment="Center"/>

<Button Content="LookUp" Grid.Row="0" Grid.Column="1" FontSize="32" FontFamily="SketchFlow Print" CommandParameter="{Binding SelectedItem, ElementName=comboBox}" Command="{Binding SearchCommand, Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="Center" />

<Button Content="CopyResult" Grid.Row="1" Grid.Column="1" FontSize="32" FontFamily="Comic Sans MS" HorizontalAlignment="Center" VerticalAlignment="Center" Command="{Binding CopyCommand, Mode=OneWay}" />

<sdk:Label  Grid.Row="1" Grid.Column="0" FontSize="20" Content="{Binding Animal.Name}" HorizontalAlignment="Center" VerticalAlignment="Center"/>

</Grid>

<Grid Grid.Row="1">

<Grid.Background>

<ImageBrush Stretch="Fill" ImageSource="{Binding Animal.Image}"/>

</Grid.Background>

<Border BorderBrush="LightBlue" BorderThickness="3"/>

</Grid>

</Grid>

</UserControl>

AnimalView.xaml.Cs  无特别内容 

 

AnimalViewModel.cs 

using System;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.ComponentModel;

using SearchAnimals.Model;

using Microsoft.Expression.Interactivity.Core;

using System.Collections.Generic;

namespace SearchAnimals.ViewModel

{

    public class AnimalViewModel:INotifyPropertyChanged

    {

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region AnimalViewModel 私有属性

        

        /// <summary>

        /// 定义一个AnimalModel对象

        /// </summary>

        private AnimalModel _Animal;

        private ICommand _SearchCommand;

        private ICommand _CopyCommand;

        private List<String> _ListYear;

        private String _SelectYear;

        #endregion

        #region AnimalViewModel 共有属性

        public AnimalModel Animal {

            get {

                return _Animal;

            }

            set {

                _Animal = value;

                updata("Animal");

            }            

        }

        public String SelectYear {

            get {

                return _SelectYear;

            }

            set {

                _SelectYear = value;

                updata("SelectYear");

            }

        }

        public ICommand SearchCommand {

            get {

                if (_SearchCommand == null) _SearchCommand = new ActionCommand(search);

                return _SearchCommand;

            }

        }

        public ICommand CopyCommand {

            get {

                if (_CopyCommand == null) _CopyCommand = new ActionCommand(copy);

                return _CopyCommand;

            }

        }

        public List<String> ListYear {

            get {

                return _ListYear;

            }

            set {

                _ListYear = value;

            }

        }

        

        #endregion

        #region 私有方法

        private void updata(String name) {

            if (PropertyChanged != null) {

                PropertyChanged(this, new PropertyChangedEventArgs(name));

            }

        }

        

        /// <summary>

        /// 更新 选择生肖

        /// </summary>

        /// <param name="obj"></param>

        private void search(Object obj) {

            String year = obj.ToString();

            String strName = getAnimalNameByYear(int.Parse(year));

            String strImage = "";

            

            switch (strName) {

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_shu.jpg";

                    break;

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_niu.jpg";

                    break;

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_hu.jpg";

                    break;

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_tu.jpg";

                    break;

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_long.jpg";

                    break;

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_shejpg";

                    break;

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_ma.jpg";

                    break;

                case "":

                   strImage = "/SearchAnimals;component/Images/animal_yang.jpg";

                    break;

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_hou.jpg";

                    break;

                case "":

                    strImage = "/SearchAnimals;component/Images/animal_ji.jpg";

                    break;

                case "":

                   strImage = "/SearchAnimals;component/Images/animal_gou.jpg";

                    break;

                case "":

                   strImage = "/SearchAnimals;component/Images/animal_zhu.jpg";

                    break;

            }

            _Animal.Year = year;

            _Animal.Name = strName;

            _Animal.Image = strImage;

        }

        private void copy() {

            Clipboard.SetText(_Animal.Name);

            MessageBox.Show("GongXi , Copy of it Ok!");

        }

        /// <summary>

        /// 通过年份 获取 生效

        /// </summary>

        /// <param name="year"></param>

        /// <returns></returns>

        private String getAnimalNameByYear(int year) {

            String name = "";

            int initialYear = 1900;

            int judgeYear = (year - initialYear) % 12;

            switch (judgeYear)

            {

                case 0:

                    name = "";                               

                    break;

                case 1:

                    name = "";  

                    break;

                case 2:

                    name = "";  

                    break;

                case 3:

                    name = "";  

                    break;

                case 4:

                    name = "";  

                    break;

                case 5:

                    name = "";  

                    break;

                case 6:

                    name = "";  

                    break;

                case 7:

                    name = "";  

                    break;

                case 8:

                    name = "";  

                    break;

                case 9:

                    name = "";  

                    break;

                case 10:

                    name = "";  

                    break;

                case 11:

                    name = "";  

                    break;

                default:

                    MessageBox.Show("请重新选择!");

                    break;

            }

            return name;

        }

        /// <summary>

        /// 初始化 选择的年份

        /// </summary>

        /// <returns></returns>

        private List<String> initListYear() {

            List<String> listyear = new List<string>();

            for (int numbers = 2140; numbers >= 1980; numbers--) {

                listyear.Add(numbers.ToString());

            }

            return listyear;

        }

        /// <summary>

        /// 初始化 Animal

        /// </summary>

        /// <returns></returns>

        private AnimalModel initAnimal() {

            AnimalModel am = new AnimalModel();

            am.Year = "2010";

            am.Name = "";

            am.Image = "Images/animal_hu.jpg";

            return am;

        }       

        #endregion

        /// <summary>

        /// AnimalViewModel 构造方法

        /// </summary>

        public AnimalViewModel() {

            _Animal = initAnimal();           

            _ListYear = initListYear();

        }

    }

}

 

运行效果如下: