将单选按钮绑定到特定对象列表中的枚举

本文关键字:列表 枚举 对象 单选按钮 绑定 | 更新日期: 2023-09-27 18:33:42

>我遇到以下情况:

  • 我有一个对象列表(List<MyObjects>(。
  • MyObjects 包含一个名为 States 的枚举和其他一些属性,如 ObjectName

    public enum States { State1, State2, State3, State4, State5 }
    public string ObjectName { get; set; }
    // some more Properties
    

    以及一个私人领域和一个属性,如下所示:

    private States _state = States.State1; // State1 is the default state
    public States State
    {
      get { return _state; }
      set
      {
        if (_state != value)
        {
          _state = value;  
          OnPropertyChanged("State");
        }
      }
    }
    
  • 在我的 XAML 中,我想在 ListView 中显示MyObjects列表,并为枚举的每个状态显示五个单选按钮。我这样做如下:

    <ListView x:Name="myObjectsListView"
              ItemsSource="{Binding MyObjectList}">
      <ListView.View>
        <GridView>
           <GridViewColumn DisplayMemberBinding="{Binding ObjectName}"
                           Header="Object Name"
                           Width="Auto"/>
           <!-- some more GridViewColumns -->
         </GridView>
       </ListView.View>
    </ListView>
    <StackPanel>
        <RadioButton x:Name="state1RB"
            Content="{x:Static States.State1}"
            IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State,
                UpdateSourceTrigger=PropertyChanged,
                Converter={StaticResource enumToBool},
                ConverterParameter={x:Static States.State1},
                Mode=TwoWay}"/>
        <RadioButton x:Name="state2RB"
            Content="{x:Static States.State2}"
            IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State,
                UpdateSourceTrigger=PropertyChanged,
                Converter={StaticResource enumToBool},
                ConverterParameter={x:Static States.State2},
                Mode=TwoWay}"/>
        <RadioButton x:Name="state3RB"
            Content="{x:Static States.State3}"
            IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State,
                UpdateSourceTrigger=PropertyChanged,
                Converter={StaticResource enumToBool},
                ConverterParameter={x:Static States.State3},
                Mode=TwoWay}"/>
    
        <RadioButton x:Name="state4RB"
            Content="{x:Static States.State4}"
            IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State,
                UpdateSourceTrigger=PropertyChanged,
                Converter={StaticResource enumToBool},
                ConverterParameter={x:Static States.State4},
                Mode=TwoWay}"/>
        <RadioButton x:Name="state5RB"
            Content="{x:Static States.State5}"
            IsChecked="{Binding ElementName=myObjectsListView, Path=SelectedItem.State,
                UpdateSourceTrigger=PropertyChanged,
                Converter={StaticResource enumToBool},
                ConverterParameter={x:Static States.State5},
                Mode=TwoWay}"/>
    </StackPanel>
    
  • 我正在使用一个 EnumToBoolean 转换器,它看起来像这样:

    [ValueConversion(typeof(System.Enum), typeof(bool))]
    public class EnumToBooleanConverter : IValueConverter
    {
      public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
      {
         return value.Equals (parameter);
      }
      public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
      {
        if ((Boolean)value)
          return parameter;
        return null;
      }
    }
    
绑定有效,单选按钮

的显示有效,但问题是当我检查列表视图中第一个元素的另一个单选按钮时, State已正确保存。当我现在更改列表视图中的选定项,然后再次选择列表视图中的第一项时,不会选中单选按钮,因为不会调用 State 属性的 getter。

正在寻找解决方案,但我的具体问题是,我有一个包含状态的MyObjects列表,并且在更改所选项目时,也应该更改所选单选按钮。

我希望有人了解我的问题并可以提供帮助。

提前感谢,话筒

将单选按钮绑定到特定对象列表中的枚举

您的代码有效,我已经在一个新项目中重新创建了它,并且在您更改 SelectedItem 时(即将选择更改为非默认值后(,它会正确更新单选按钮以反映最新值。

我认为项目中还有其他干扰因素,您应该尝试取出解决方案的各个部分并单独测试它们。

如果您使用的是 MVVM,我找到了使用 ICommand 更新视图模型中的 SelectedItem 的好方法。 XAML 如下所示。

    <RadioButton x:Name="state5RB"
    Content="{x:Static States.State5}"
    Command="{Binding UpdateSelectedItemCommand}"
    IsChecked="{Binding Path=State,
        UpdateSourceTrigger=PropertyChanged,
        Converter={StaticResource enumToBool},
        ConverterParameter={x:Static States.State5},
        Mode=TwoWay}">
       <RadioButton.CommandParameter>
           <myEnum:State>State5</myEnum:State>          
       </RadioButton.CommandParameter>
   </RadioButton>

视图模型将如下所示:

ICommand UpdateSelectedItemCommand {get;set;}
..
UpdateSelectedItemCommand = new DelegateCommand( (param) =>
{
   State= (States) param;
});

将委托命令替换为实现 ICommand 的自定义对象。