Silverlight中使用MVVM(9)-绑定Enum类型数据

Silverlight中使用MVVM(1)--基础

Silverlight中使用MVVM(2)—提高

Silverlight中使用MVVM(3)—进阶

Silverlight中使用MVVM(4)—演练

Silverlight中使用MVVM(5)-Command II

Silverlight中使用MVVM(6):AutoComplteBox的异步过滤

Silverlight中使用MVVM(7):DataGrid中触发Button的Click事件

Silverlight中使用MVVM(8)-使用AttachedProperty关闭ChildWindow

    在实际开发程序的过程中,不乏处理枚举类型的情形, 比如在Code-Behind的方式下处理RadionButton是很容易的,但是如果在纯MVVM模式下通过绑定的方式

可能需要你花费不少的时间,本文提供MVVM模式下处理RadionButton与枚举类型绑定的一种方式:

      首先看张效果图:

     image

     我们要做的事情很简单,就是将枚举的属性值绑定到RadioButton上,有了本系列前面几篇文章的基础,我相信建立一个MVVM的框架已经了然于心了,所以本篇的重点集中

在ViewModel和View中.

     首先我们构建一个枚举类型,ViewModel代码如下:

 public class ShellViewModel :PropertyChangedBase,IShell
  {
      private SwapDuteType _currentSwapOffDuteType;
      public SwapDuteType CurrentSwapOffDuteType
      {
          get { return _currentSwapOffDuteType; }
          set { _currentSwapOffDuteType = value;
              NotifyOfPropertyChange(() =>CurrentSwapOffDuteType );
          }
      }
      public ShellViewModel()
      {
          _currentSwapOffDuteType = SwapDuteType.TM;
      }
   }
  public enum SwapDuteType
    {
      TM, AM,PM
    }

      ViewModel中仅仅创建了一个枚举类型的属性,我们在View中放3个RadionButton:

<RadioButton  x:Name="tm" GroupName="t"
                   IsChecked="{Binding CurrentSwapOffDuteType, ConverterParameter=TM, Converter={StaticResource EnumConverter}, Mode=TwoWay}" 
                   IsThreeState="False"    Content="全天" VerticalAlignment="Center" Margin="5,0">
</RadioButton>
<RadioButton  x:Name="am"  IsThreeState="False"  GroupName="a" 
                IsChecked="{Binding CurrentSwapOffDuteType, ConverterParameter=AM, Converter={StaticResource EnumConverter}, Mode=TwoWay}"
                Content="上午"  VerticalAlignment="Center" Margin="5,0">
</RadioButton>
<RadioButton x:Name="pm"  GroupName="p" 
                            IsChecked="{Binding CurrentSwapOffDuteType, ConverterParameter=PM, Converter={StaticResource EnumConverter}, Mode=TwoWay}"
            IsThreeState="False"    Content="下午" VerticalAlignment="Center" Margin="5,0">

      关键的地方在于我们用的Converter, 这里其实主要是关于Enum.Parse()的使用:

    public class EnumConverter : IValueConverter
   {
       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
           if (value == null || parameter == null)
               return value;
 
           return value.ToString() == parameter.ToString();
       }
 
       public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
       {
           if (value == null || parameter == null)
               return value;
           return Enum.Parse(targetType, (String)parameter, true);
       }
   }

    这样我们就完成了最基本的View/ViewModel的内容,本系列前几篇都是以RelayCommand的方式处理View与ViewModel的联系,大约1年前我写了关于介绍Caliburn的几篇入门文章,

此后一直关注这个框架,但是由于当时产品已经初有成效,所以并未在实际的项目中采用,而现在它的精简版本Caliburn.Mirco甚至超越了Caliburn本身,随着产品的稳定,我也开始着手改善产品的架构.

自然不会在原来的源代码上修改了,毕竟思想不完全一样,否则反而会得不偿失.目前是倾向于使用Caliburn.Mirco重构客户端的代码,至少目前主要用到的特性比如Conventions,Actions都是挺不错的.

   因此本文源码中使用Cailburn.Mirco作为MVVM的框架,包括本系列的后续教程都会在此基础上,顺便会涉及该框架的一些使用.  

  

   源码下载:EnumInMVVM.rar

posted @ 2012-05-22 10:55  ringgo  阅读(1910)  评论(1编辑  收藏  举报