У меня есть перечисление как это:
public enum MyLovelyEnum
{
FirstSelection,
TheOtherSelection,
YetAnotherOne
};
Я получил свойство в моем DataContext:
public MyLovelyEnum VeryLovelyEnum { get; set; }
И я получил три RadioButton в моем клиенте WPF.
<RadioButton Margin="3">First Selection</RadioButton>
<RadioButton Margin="3">The Other Selection</RadioButton>
<RadioButton Margin="3">Yet Another one</RadioButton>
Теперь, как мне привязать RadioButtons к свойству для правильной двусторонней привязки?
Ответы:
Вы можете использовать более общий конвертер
И в XAML-части вы используете:
источник
Вы можете еще больше упростить принятый ответ. Вместо того, чтобы печатать перечисления в виде строк в xaml и выполнять в конвертере больше работы, чем необходимо, вы можете явно передать значение перечисления вместо строкового представления, и, как прокомментировал CrimsonX, ошибки генерируются во время компиляции, а не во время выполнения:
ConverterParameter = {x: Статический локальный: YourEnumType.Enum1}
Тогда упростим конвертер:
Изменить (16 декабря '10):
Спасибо anon за предложение вернуть Binding.DoNothing, а не DependencyProperty.UnsetValue.Примечание. Несколько групп радиокнопок в одном контейнере (17 февраля 2011 г.):
В xaml, если переключатели совместно используют один и тот же родительский контейнер, выбор одного из них отменяет выбор всех других в этом контейнере (даже если они связаны с другим свойством). Поэтому постарайтесь сохранить ваши RadioButton, связанные с общим свойством, сгруппированными в их собственном контейнере, как панель стека. В тех случаях, когда ваши связанные RadioButtons не могут совместно использовать один родительский контейнер, установите для свойства GroupName каждого RadioButton общее значение, чтобы логически сгруппировать их.Изменить (5 апреля '11):
Упрощенное использование ConvertBack if-else для использования тернарного оператора.Примечание. Тип перечисления, вложенный в класс (28 апреля 2011 г.):
Если ваш тип перечисления вложен в класс (а не непосредственно в пространство имен), вы можете использовать синтаксис «+» для доступа к перечислению в XAML, как указано в (не отмеченном) ответе на вопрос « Невозможно найти» Тип enum для статической ссылки в WPF :ConverterParameter = {x: Статический локальный: YourClass + YourNestedEnumType.Enum1}
Однако из-за этой проблемы с Microsoft Connect дизайнер в VS2010 больше не будет загружать отчеты
"Type 'local:YourClass+YourNestedEnumType' was not found."
, но проект компилируется и успешно выполняется. Конечно, вы можете избежать этой проблемы, если сможете напрямую переместить тип enum в пространство имен.Изменить (27 января '12):
Если использовать флаги Enum, конвертер будет выглядеть следующим образом:Изменить (7 мая '15):
В случае Nullable Enum (это не задается в вопросе, но может быть необходимо в некоторых случаях, например, ORM возвращает ноль из БД или всякий раз, когда может иметь смысл, что в логике программы значение не указано), не забудьте добавить начальная нулевая проверка в методе Convert и возвращение соответствующего значения bool, которое, как правило, ложно (если вы не хотите, чтобы какая-либо радиокнопка была выбрана), как показано ниже:Примечание - NullReferenceException (10 октября '18):
Обновлен пример, чтобы исключить возможность создания исключения NullReferenceException.IsChecked
это обнуляемый тип, поэтому возвращениеNullable<Boolean>
кажется разумным решением.источник
Для ответа EnumToBooleanConverter: вместо возврата DependencyProperty.UnsetValue рассмотрите возможность возврата Binding.DoNothing для случая, когда значение переключателя IsChecked становится ложным. Первый указывает на проблему (и может показывать пользователю красный прямоугольник или аналогичные индикаторы проверки), а второй просто указывает, что ничего не должно быть сделано, что и требуется в этом случае.
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback.aspx http://msdn.microsoft.com/en-us/library/system.windows.data.binding .donothing.aspx
источник
Я бы использовал RadioButtons в ListBox, а затем привязать к SelectedValue.
Это старая ветка на эту тему, но основная идея должна быть такой же: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/
источник
Для UWP это не так просто: вы должны перепрыгнуть через дополнительный обруч, чтобы передать значение поля в качестве параметра.
Пример 1
Действительно как для WPF, так и для UWP.
Пример 2
Действительно как для WPF, так и для UWP.
Пример 3
Действительно только для WPF!
UWP не поддерживает
x:Static
поэтому пример 3 исключен; при условии, что вы перейдете к примеру 1 , результатом будет более подробный код. Пример 2 немного лучше, но все же не идеал.Решение
Затем для каждого типа, который вы хотите поддерживать, определите конвертер, который включает тип enum.
Причина, по которой он должен быть в штучной упаковке, заключается в том, что, похоже, нет способа ссылаться на тип в
ConvertBack
методе; бокс заботится об этом. Если вы используете один из первых двух примеров, вы можете просто ссылаться на тип параметра, исключая необходимость наследования от упакованного класса; если вы хотите сделать все это в одну строку и с минимально возможным многословием, последнее решение является идеальным.Использование напоминает пример 2 , но на самом деле оно менее многословно.
Недостатком является то, что вы должны определить конвертер для каждого типа, который вы хотите поддерживать.
источник
Я создал новый класс для обработки привязки RadioButtons и CheckBoxes к перечислениям. Он работает для помеченных перечислений (с несколькими вариантами флажков) и непомеченных перечислений для флажков с одним выбором или переключателей. Это также не требует никаких ValueConverters вообще.
На первый взгляд это может показаться более сложным, однако, как только вы скопируете этот класс в свой проект, все готово. Он универсален, поэтому его можно легко использовать для любого перечисления.
А как его использовать, скажем, у вас есть перечисление для запуска задачи вручную или автоматически, и его можно запланировать на любые дни недели, а также некоторые дополнительные параметры ...
Теперь, как легко использовать этот класс:
И вот как легко связать флажки и переключатели с этим классом:
источник
EnumSelection<StartTask>
объектом. Если вы посмотрите на определение,EnumSelection<T>
вы увидите, что оно имеет свойство Value. Таким образом, модель представления не должна иметь «SelectedStartTask». Вы бы использовалиStartUp.Value
. А что касается значения по умолчанию Undefined, см. 3-е перечисление AdditionalOptions, у него есть None вместо Undefined, но вы можете изменить его имя на любое другое.Это работает для Checkbox тоже.
Привязка одного перечисления к нескольким флажкам.
источник
Основано на EnumToBooleanConverter от Скотта. Я заметил, что метод ConvertBack не работает в Enum с кодом flags.
Я пробовал следующий код:
Единственное, что я не могу получить на работе - это выполнить приведение
int
к тому,targetType
чтобы я сделал это жесткоNavigationProjectDates
, к перечислению, которое я использую. ИtargetType == NavigationProjectDates
...Редактировать для более общего конвертера Flags Enum:
источник
Вы можете создавать переключатели динамически,
ListBox
может помочь вам сделать это, без конвертеров, довольно просто.Конкретные шаги приведены ниже: создайте ListBox и задайте ItemsSource для списка как enum
MyLovelyEnum
и привяжите SelectedItem ListBox кVeryLovelyEnum
свойству. Затем будут созданы радиокнопки для каждого элемента ListBoxItem.Control Template
заполните каждый элемент внутри как кнопку-переключательПреимущество ниже: если когда - нибудь ваши изменения класса перечислений, вам не нужно обновлять графический интерфейс (XAML - файл).
Ссылки: https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/
источник