【问题标题】:Binding enum to checkboxes and bitwise operation将枚举绑定到复选框和按位操作
【发布时间】:2011-12-06 23:51:34
【问题描述】:

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

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

目前,由于我需要它工作,我从后面的代码中手动分配 IsChecked...

如果您有解决方案,那就太好了!另外我想知道当我需要“阅读”选中的复选框时绑定将如何工作;即如何获得 'Monday |星期三 | Thursday',或 13,或复选框中绑定变量中的任何内容 /me scratch head

感谢您的帮助;)

西尔万

【问题讨论】:

    标签: c# silverlight data-binding ivalueconverter


    【解决方案1】:

    首先是这样:-

    return (day & mask) == day;
    

    应该是

    return (day & mask) == mask;
    

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

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

    【讨论】:

    • 谢谢安东尼,我的情况确实有问题。我担心它只会以一种方式起作用...... Henk 给出的解决方案非常适合我。
    【解决方案2】:

    整个位掩码转换器设置让我觉得过度设计。做对会很困难,也不是很灵活。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 2023-03-06
      • 2014-03-20
      • 2010-09-24
      • 2014-10-14
      • 2012-04-21
      • 2016-02-06
      • 2012-01-21
      相关资源
      最近更新 更多