Как привязать радио-кнопки к перечислению?

С цепью метода:

product = (
    df1.assign(key=1)
    .merge(df2.assign(key=1), on="key")
    .drop("key", axis=1)
)
395
задан H.B. 5 February 2012 в 00:43
поделиться

3 ответа

Вы могли использовать более универсальный преобразователь

public class EnumBooleanConverter : IValueConverter
{
  #region IValueConverter Members
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    string parameterString = parameter as string;
    if (parameterString == null)
      return DependencyProperty.UnsetValue;

    if (Enum.IsDefined(value.GetType(), value) == false)
      return DependencyProperty.UnsetValue;

    object parameterValue = Enum.Parse(value.GetType(), parameterString);

    return parameterValue.Equals(value);
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    string parameterString = parameter as string;
    if (parameterString == null)
        return DependencyProperty.UnsetValue;

    return Enum.Parse(targetType, parameterString);
  }
  #endregion
}

, И в XAML-части Вы используете:

<Grid>
    <Grid.Resources>
      <l:EnumBooleanConverter x:Key="enumBooleanConverter" />
    </Grid.Resources>
    <StackPanel >
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=FirstSelection}">first selection</RadioButton>
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=TheOtherSelection}">the other selection</RadioButton>
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=YetAnotherOne}">yet another one</RadioButton>
    </StackPanel>
</Grid>
379
ответ дан David Schmitt 5 February 2012 в 11:43
поделиться

Я использовал бы RadioButtons в ListBox и затем связал бы с SelectedValue.

Это - более старый поток об этой теме, но основная идея должна быть тем же: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/

5
ответ дан Martin Moser 5 February 2012 в 11:43
поделиться

Вы можете еще больше упростить принятый ответ.Вместо того, чтобы вводить перечисления в виде строк в xaml и выполнять больше работы в вашем конвертере, чем необходимо, вы можете явно передать значение перечисления вместо строкового представления, и, как прокомментировал CrimsonX, ошибки возникают во время компиляции, а не во время выполнения:

ConverterParameter = {x: Static local: YourEnumType.Enum1}

<StackPanel>
    <StackPanel.Resources>          
        <local:ComparisonConverter x:Key="ComparisonConverter" />          
    </StackPanel.Resources>
    <RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum1}}" />
    <RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum2}}" />
</StackPanel>

Затем упростите преобразователь:

public class ComparisonConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value?.Equals(parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value?.Equals(true) == true ? parameter : Binding.DoNothing;
    }
}

Примечание - NullReferenceException (10 октября 2018 г.):

Обновлен пример, чтобы исключить возможность выброса исключения NullReferenceException. IsChecked - это тип, допускающий значение NULL, поэтому возвращение Nullable<Boolean> кажется разумным решением.

Примечание. Несколько групп RadioButton в одном контейнере (17 февраля 2011 г.):

В xaml, если переключатели используют один и тот же родительский контейнер, то при выборе одного из них будут отменены все остальные в этом контейнере (даже если они привязаны к другому свойству). Поэтому постарайтесь, чтобы ваши RadioButton, привязанные к общему свойству, были сгруппированы вместе в их собственном контейнере, таком как панель стека. В случаях, когда ваши связанные RadioButton не могут совместно использовать один родительский контейнер, установите для свойства GroupName каждого RadioButton общее значение, чтобы логически сгруппировать их.

Примечание. Тип Enum вложен в класс (28 апреля 2011 г.):

Если ваш тип перечисления вложен в класс (а не непосредственно в пространство имен), вы можете использовать синтаксис «+» для доступа к перечислению в XAML, как указано в (не отмеченном) ответе на вопрос Не удалось найти тип перечисления для статической ссылки в WPF :

ConverterParameter = {x: Статический локальный: YourClass + YourNestedEnumType.Enum1}

Однако из-за этой проблемы Microsoft Connect конструктор в VS2010 больше не будет загружаться с указанием «Тип 'local: YourClass + YourNestedEnumType' не найден». , но проект компилируется и запускается успешно. Конечно, вы можете избежать этой проблемы, если сможете напрямую переместить свой тип перечисления в пространство имен.

Редактировать (16 декабря 2010 г.):

Спасибо anon за предложение вернуть Binding.DoNothing, а не DependencyProperty.UnsetValue.

Редактировать (5 апреля 2011 г.):

Упрощенный if-else ConvertBack для использования тернарного оператора.

Редактировать (27 января 2012 г.):

При использовании флагов Enum преобразователь будет следующим:
public class EnumToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((Enum)value).HasFlag((Enum)parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.Equals(true) ? parameter : Binding.DoNothing;
    }
}

Редактировать (7 мая 2015 г.):

В случае Nullable Enum (то есть не задается в вопросе, но может быть необходимо в некоторых случаях, например, ORM возвращает null из БД или когда это может иметь смысл, что в логике программы значение не при условии), не забудьте добавить начальную нулевую проверку в методе преобразования и вернуть соответствующее значение типа bool, которое обычно является ложным (если вы не хотите, чтобы какой-либо переключатель был выбран), как показано ниже:
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) {
            return false; // or return parameter.Equals(YourEnumType.SomeDefaultValue);
        }
        return value.Equals(parameter);
    }
550
ответ дан 22 November 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: