2015-07-27 4 views
2

Задача: Связывание свойства типа Enum с RadioButtons с использованием параметризованного конвертера. Никакое исключение не было, Radiobutton может иметь проблемы с проверкой (не уверен). Во время тестирования отображается красный флажок вокруг RadioButtons.Binding RadioButton to Enum

информация: пытается использовать решение, данное в How to bind RadioButtons to an enum?

У меня есть Enum, как это:

namespace crmVerwaltungstools.Models 
{ 
    public enum CrmSystemType 
    { 
    Training = 0, 
    Live = 1 
    } 
} 

BooleanToEnumConverter:

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) ? (CrmSystemType)parameter : Binding.DoNothing; 
    } 

и внутри моего окна :

xmlns:models="clr-namespace:crmVerwaltungstool.Models" 

    <StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Orientation="Horizontal"> 
      <StackPanel.Resources> 
       <converter:RadioButtonIsCheckedToCrmSystemTypeConverter x:Key="RbIsCheckedToCrmSystemTypeConverter" /> 
      </StackPanel.Resources> 

      <RadioButton Content="Schulungs-System" GroupName="rbg_SelectSystem" 
           IsChecked="{Binding Path=SystemType, Converter={StaticResource RbIsCheckedToCrmSystemTypeConverter}, 
           ConverterParameter={x:Static models:CrmSystemType.Training}}"/> 
      <RadioButton Content="Live-System" GroupName="rbg_SelectSystem" 
           IsChecked="{Binding Path=SystemType, Converter={StaticResource RbIsCheckedToCrmSystemTypeConverter}, 
           ConverterParameter={x:Static models:CrmSystemType.Live}}"/> 
     </StackPanel> 

Невозможно увидеть ошибки. (Возможно, сейчас мы видели слишком много строк кода ...)

Спасибо за помощь!

ответ

0

проблема решена.

Я нашел маленький кусок старого кода внутри моей модели просмотра, где я попытался определить мое перечисление как внутренний класс.

Так что, в основном, моя программа была смущена, какой enum использовать - внутренний класс внутри viewmodel или внешний класс внутри папки моделей.

После того как я удалил внутреннее перечисление, все работает нормально.

1

Прежде всего, необходимо проверить в конверторе, что значение не равно нулю:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
     { 
      return false; 
     } 
     return value.Equals(parameter); 
    } 

сделать и в ConvertBack метода.

Во-вторых, написать XAML что-то вроде этого:

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

Доброе утро, все еще есть эта проблема. Добавлена ​​проверка 'value == null'. Во время тестирования никогда не видел, чтобы он стал «истинным». Возможно, потому что значение по умолчанию Enum - это значение в индексе [0] этого перечисления, в моем случае значением по умолчанию будет «Training». Собственно, 'Stackpanel.Resources'part уже существует, забыл ввести код моего вопроса. Я отредактирую свой вопрос и добавлю эту недостающую часть. Спасибо за помощь! – Daniel

+0

Что такое SystemType? –

+0

Вы имеете в виду 'CrmSystemType'? Это тип Enum, созданный мной для выбора того, к какому из нашего Crm-сервера я хочу подключиться. Live- или Training-Server. – Daniel