将RadioButton绑定到枚举类型

3
问题: 使用参数化转换器将枚举类型的属性绑定到单选按钮,没有抛出异常,但单选按钮可能存在验证问题(不确定)。测试时显示单选按钮周围的红框。
信息: 尝试使用以下解决方案: 如何将单选按钮绑定到枚举? 我有一个像这样的枚举:
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;
    }

在我的Window里:

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>

没有看到任何错误。(可能只是今天看太多代码了...)

谢谢帮忙!!

2个回答

2
问题已解决。
我在我的视图模型中找到了一小段旧代码,其中我试图将我的枚举定义为一个内部类。
因此,基本上,我的程序不知道要使用哪个枚举 - 视图模型中的内部类还是模型文件夹中的外部类。
在我删除了内部枚举之后,一切正常运行。

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>

早上好,问题还在。已添加 value == null 检查。测试时从未看到它变为“真”。也许是因为枚举的默认值是该枚举的index [0]处的值,在我的情况下,默认值将是 'Training'。实际上,Stackpanel.Resources 部分已经存在,只是忘了将其放入我的问题代码中。 我将编辑我的问题并添加该缺失部分。 谢谢您的帮助! - Daniel
你是指 CrmSystemType 吗? 这是我自己创建的枚举类型,用于选择连接到我们的哪个 CRM 服务器。可以是生产环境或培训环境。 - Daniel
这是我的属性名称。private CrmSystemType systemType public CrmSystemType SystemType { get { return systemType; } set { systemType = value; OnPropertyChanged("SystemType"); } } - Daniel
1
在另一个专门用于测试此功能的项目中,它运行得非常好,就像我在“信息”下提到的解决方案一样。因此,我的代码内部肯定存在一些问题。好吧,现在我必须深入挖掘我的代码了xD,但感谢您的帮助。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接