Silverlight中使用MVVM(9)-绑定Enum类型数据
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与枚举类型绑定的一种方式:
首先看张效果图:
我们要做的事情很简单,就是将枚举的属性值绑定到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