在Silverlight Web应用程序中,我有一个服务及其界面,我在其中声明了一周的日期:
[Serializable]
[DataContract]
[Flags]
public enum WeekDaysFlags : int {
[EnumMember]
Monday = 1,
[EnumMember]
Tuesday = 2,
[EnumMember]
Wednesday = 4,
[EnumMember]
Thursday = 8,
etc.
回到应用程序中,我每天都有一个我想要绑定的复选框;我做了一个漂亮的转换器,接受一个参数:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int d;
if (int.TryParse(parameter.ToString(), out d))
{
WeekDaysFlags mask = WeekDaysFlags.Monday;
switch (d)
{
case 0:
mask = WeekDaysFlags.Sunday;
break;
case 1:
mask = WeekDaysFlags.Monday;
break;
case 2:
mask = WeekDaysFlags.Tuesday;
break;
case 3:
mask = WeekDaysFlags.Wednesday;
break;
case 4:
mask = WeekDaysFlags.Thursday;
break;
case 5:
mask = WeekDaysFlags.Friday;
break;
case 6:
mask = WeekDaysFlags.Saturday;
break;
}
WeekDaysFlags day = (WeekDaysFlags)value;
return (day & mask) == day;
}
return false;
}
然后复选框的IsChecked属性接收如下所示,每天的参数从0到6 .
IsChecked="{Binding WeeksDays, Mode=TwoWay, Converter={StaticResource DayOfWeekConverter}, ConverterParameter=1}"
然后我运行我的程序,读取数据库,绑定对象aaaaand ......什么都没有!我希望周日和周三检查,因为WeekDays变量包含5.当我调试时,我会使用正确的值和正确的参数进入转换器,当它应该这样做时它会返回true或false,但是在用户界面,未勾选任何复选框 . 没有comprendo ...
目前,由于我需要它工作,我从后面的代码手动分配IsChecked ...
如果你有一个解决方案,那就太好了!另外我想知道当我需要"read"复选复选框时绑定是如何工作的;即如何从复选框/我刮刮头中获取'Monday | Wednesday | Thursday',或13,或者我的绑定变量中的任何内容
谢谢您的帮助 ;)
西尔
2 回答
整个位掩码转换器设置让我感到过度工程化 . 很难做到正确,而且不是很灵活 .
考虑将您的枚举解压缩到ViewModel上的一组布尔值中 . 使其成为(bool,string)的列表,您可以使用CheckBox模板将其绑定到ItemsControl . 不再重复代码和标记 .
对于初学者来说这是: -
应该
我会进一步说,你应该看一下使用
Enum.Parse
. 这将允许您在ConvertParameter
赋值中使用"Sunday","Monday"之类的日期单词 . 这将使Xaml更具可读性并消除丑陋的switch
构造 .你明白这只是一种方式吗?如果用户选择/取消选择组合框,则无法使用此转换器方法更新位字段 . 这是因为需要能够读取位域的当前状态以更新它,但
IValueConverter
中的反向转换无法发现值的当前状态 .