Привязка перечисления к флажкам и побитовой операции - PullRequest
1 голос
/ 13 октября 2011

В веб-приложении Silverlight у меня есть служба и ее интерфейс, в котором я объявил Enum с днями недели:

[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, когда это предполагается сделать, но в пользовательском интерфейсе ни один из флажков не установлен. Нет понимания ...

На данный момент, так как мне нужно, чтобы он работал, я назначаю IsChecked вручную из кода позади ...

Если у вас есть решение, это было бы здорово! Также мне интересно, как будет работать привязка, когда мне нужно будет «прочитать» отмеченные флажки; то есть как получить 'понедельник | Среда | Четверг, или 13, или что-то в моей переменной из флажков / я поцарапать голову

Спасибо за помощь;)

Сильвен

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Хорошо для начала это: -

return (day & mask) == day;

должно быть

return (day & mask) == mask;

Я бы пошел дальше и сказал бы, что вы должны использовать Enum.Parse. Это позволит вам использовать дневные слова, такие как «воскресенье», «понедельник» в ваших ConvertParameter заданиях. Это сделает Xaml более читабельным и устранит уродливую конструкцию switch.

Вы понимаете, что это работает только в одном направлении? Вы не можете использовать этот подход конвертера для обновления битового поля, если пользователь выбирает / отменяет выбор поля со списком. Это связано с необходимостью иметь возможность прочитать текущее состояние битового поля для его обновления, но обратное преобразование в IValueConverter не может обнаружить текущее состояние значения.

1 голос
/ 13 октября 2011

Вся настройка конвертера битовых масок кажется мне чрезмерной.Это будет трудно сделать правильно, и это не очень гибко.

Рассмотрите возможность распаковки вашего enum в массив логических значений на вашей ViewModel.Сделайте его списком (bool, string), и вы можете привязать его к ItemsControl с помощью шаблона CheckBox.Нет больше повторного кода и разметки.

...