Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将枚举绑定到复选框和按位操作_C#_Silverlight_Data Binding_Ivalueconverter - Fatal编程技术网

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

C# 将枚举绑定到复选框和按位操作,c#,silverlight,data-binding,ivalueconverter,C#,Silverlight,Data Binding,Ivalueconverter,在Silverlight Web应用程序中,我有一个服务及其接口,我在其中声明了一个每周天数的枚举: [Serializable] [DataContract] [Flags] public enum WeekDaysFlags : int { [EnumMember] Monday = 1, [EnumMember] Tuesday = 2, [EnumMember] Wednesday = 4, [EnumMember] Thursday = 8, etc. 回到应用程序中,我每天都有一个

在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}”

然后我运行我的程序,读取数据库,绑定对象aaaaa和。。。没有什么!我希望检查星期一和星期三,因为平日变量包含5。 当我调试时,我会使用正确的值和正确的参数进入转换器,当它应该这样做时,它会返回true或false,但在UI中,没有选中任何复选框。没有压缩

目前,由于我需要它工作,所以我从后面的代码中手动检查分配

如果你有一个解决方案,那就太好了!我还想知道,当我需要“阅读”复选框时,绑定将如何工作;i、 e.如何从复选框/me scratch head中获取“周一|周三|周四”或13,或绑定变量中的任何内容

谢谢你的帮助;)


Sylvain

对于初学者来说:-

return (day & mask) == day;
应该是

return (day & mask) == mask;
我想进一步说,您应该使用
Enum.Parse
查看一个示例。这将允许您在
ConvertParameter
作业中使用诸如“星期日”、“星期一”之类的日词。这将使Xaml更具可读性,并消除丑陋的
开关
构造


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

整个位掩码转换器设置对我来说过于工程化。这将是很难得到正确的,它不是很灵活


考虑将枚举解压缩到ViewModel上的布尔数组中。将其设置为(bool,string)列表,然后可以使用复选框模板将其绑定到ItemsControl。不再重复代码和标记

谢谢你,安东尼,我的身体确实有缺陷。我担心这只会有一种效果。。。亨克给出的解决方案非常适合我。