首页 文章

将枚举绑定到复选框和按位操作

提问于
浏览
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 ...

如果你有一个解决方案,那就太好了!另外我想知道当我需要"read"复选复选框时绑定是如何工作的;即如何从复选框/我刮刮头中获取'Monday | Wednesday | Thursday',或13,或者我的绑定变量中的任何内容

谢谢您的帮助 ;)

西尔

2 回答

  • 2

    整个位掩码转换器设置让我感到过度工程化 . 很难做到正确,而且不是很灵活 .

    考虑将您的枚举解压缩到ViewModel上的一组布尔值中 . 使其成为(bool,string)的列表,您可以使用CheckBox模板将其绑定到ItemsControl . 不再重复代码和标记 .

  • 1

    对于初学者来说这是: -

    return (day & mask) == day;
    

    应该

    return (day & mask) == mask;
    

    我会进一步说,你应该看一下使用 Enum.Parse . 这将允许您在 ConvertParameter 赋值中使用"Sunday","Monday"之类的日期单词 . 这将使Xaml更具可读性并消除丑陋的 switch 构造 .

    你明白这只是一种方式吗?如果用户选择/取消选择组合框,则无法使用此转换器方法更新位字段 . 这是因为需要能够读取位域的当前状态以更新它,但 IValueConverter 中的反向转换无法发现值的当前状态 .

相关问题