2011-10-13 86 views
1

在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

如果你有一个解决方案,那将是伟大的!我还想知道当我需要“阅读”选中的复选框时,绑定是如何工作的;即如何获得'星期一|星期三|周四,或13,或任何从复选框/我刮头

谢谢您的帮助,我的绑定变量;)

西尔

回答

1

整个位掩模转换器设置让我感到过度工程。这将是很难得到正确的,它不是很灵活。

考虑将您的枚举解压到ViewModel上的布尔值数组中。使它成为(bool,字符串)的列表,并且您可以使用CheckBox模板将它绑定到ItemsControl。没有更多的重复代码和标记。

+0

谢谢!这对我来说很好! – Slyvain

2

那么对于初学者这一点: -

return (day & mask) == day; 

应该

return (day & mask) == mask; 

我会进一步说,你应该看看使用Enum.Parse。这将允许您在ConvertParameter作业中使用“星期日”,“星期一”等日常用词。这将使Xaml更具可读性并消除丑陋的switch构造。

你知道这只适用于一种方式吗?如果用户选择/取消选择组合框,则不能使用此转换器方法更新位域。这是由于需要能够读取位域的当前状态来更新它,但IValueConverter中的反向转换无法发现值的当前状态。

+0

谢谢安东尼,我的病情确实有缺陷。我担心它只能以一种方式工作...... Henk给出的解决方案非常适合我。 – Slyvain