C# 不使用转换器将单选按钮绑定到其枚举值

C# 不使用转换器将单选按钮绑定到其枚举值,c#,wpf,mvvm,radio-button,C#,Wpf,Mvvm,Radio Button,我在列表视图中有一个单选按钮组。此listview的行(其中包括单选按钮grp)是一个可观察的集合 我编写的代码如下所示: Xaml: <RadioButton Content="EnumValueName1" GroupName="RadButGrp1" IsChecked="{Binding propertyName,Mode=TwoWay,Converter={StaticResource EnumToBoolConvert

我在列表视图中有一个单选按钮组。此listview的行(其中包括单选按钮grp)是一个可观察的集合

我编写的代码如下所示:

Xaml:

    <RadioButton Content="EnumValueName1"
             GroupName="RadButGrp1"
             IsChecked="{Binding propertyName,Mode=TwoWay,Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName1}" >
 </RadioButton>
 <RadioButton Content="EnumValueName2" 
              GroupName="RadButGrp1"
              IsChecked="{Binding propertyName,Mode=TwoWay,Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName2}">
 </RadioButton>
<RadioButton Content="EnumValueName3" 
              GroupName="RadButGrp1"
              IsChecked="{Binding propertyName,Mode=TwoWay,Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName3}">
 </RadioButton>
问题在于,在Enum.Parse行的ConvertBack函数中,出现以下参数异常:

提供的类型必须是枚举。 参数名称:enumType

是否有方法将枚举类型返回到绑定?如何告诉单选按钮它代表哪个枚举值?如何编写将适当的枚举值返回到绑定的函数


希望你们能帮忙。提前谢谢

试试这个,这是我的
EnumToBoolConverter
版本:

public class EnumToBoolConverter : BaseConverterMarkupExtension<object, bool>
{
    public override bool Convert(object value, Type targetType, object parameter)
    {
        if (value == null)
            return false;

        return value.Equals(Enum.Parse(value.GetType(), (string)parameter, true));
    }

    public override object ConvertBack(bool value, Type targetType, object parameter)
    {
        return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
    }
}
公共类EnumToBoolConverter:BaseConverterMarkupExtension
{
公共覆盖布尔转换(对象值、类型targetType、对象参数)
{
如果(值==null)
返回false;
返回value.Equals(Enum.Parse(value.GetType(),(string)参数,true));
}
公共重写对象转换回(布尔值、类型targetType、对象参数)
{
返回值.Equals(false)?DependencyProperty.Unset值:参数;
}
}

好的,一旦我正确理解了概念,解决方案就相对简单了。我做了以下工作,部分解决了我的问题

 <RadioButton Content="EnumValueName1" 
              GroupName="RadBtnGrp1"
              IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ParentControl}},
                                  Path=DataContext.propName,
                                  Mode=TwoWay,
                                  Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName1}">

 </RadioButton>

ConvertBack函数中的targetType现在是正确的枚举类型。希望这有帮助

现在我必须弄清楚如何使单选按钮在listview的多行中保留选择。目前,第一行中的选择将从其余行中取消选择同一组


谢谢你迄今为止的帮助。如果有人能为我指出一个新问题的解决方案,那将是非常棒的

建议您动态创建单选按钮,
ListBox
可以帮助我们做到这一点,而无需转换器。此方法的优点如下所示: 如果某一天枚举类发生更改,则不需要更新GUI(XAML文件)

此方法的步骤如下:
创建一个ListBox并将ListBox的ItemsSource设置为枚举,并将ListBox的SelectedItem绑定到selected属性。 然后将创建每个ListBoxItem的单选按钮

  • 步骤1:重新定义枚举
公共枚举EnumValueName
{ 
枚举值名称1,
枚举值名称2,
枚举值名称3
}
然后将以下属性添加到DataContext(或MVVM的ViewModel)中,该属性记录选中的项目

公共EnumValueNames SelectedEnumValueName{get;set;}
  • 步骤2:将枚举添加到窗口、用户控件或网格等的静态资源中

  • 步骤3:使用列表框和
    控制模板
    以单选按钮的形式填充其中的每个项目

参考文献:

你看到了吗:只是一个评论,因为我没有回答完整的问题。我所做的是将枚举作为键,值作为值打包到字典中。我尝试了u提供的链接中的解决方案,但仍然得到相同的错误。现在我在选中的单选按钮周围得到了一个红色框。此外,targetType仍然不是enum。我可以在viewmodel中编写一些实际返回枚举的内容吗?我开始感到困惑了!:(只有绑定到
Enum
源属性时,这才有效。我不知道绑定到什么。好吧,也许我的问题是如何绑定一个单选按钮组,该组的值是可观察集合的一部分?我在数据结构中绑定到的字段是int?……这就是你要问的:生成唯一组名吗对于列表视图的每一新行上的每组单选按钮,将解决取消选择问题:)应该知道!:(
 <RadioButton Content="EnumValueName1" 
              GroupName="RadBtnGrp1"
              IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ParentControl}},
                                  Path=DataContext.propName,
                                  Mode=TwoWay,
                                  Converter={StaticResource EnumToBoolConverter},ConverterParameter=EnumValueName1}">

 </RadioButton>