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

时间:2012-05-09 15:00:29

标签: c# wpf enums radio-button

我有以下情况:

  • 我有一个对象列表(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 Converter,它看起来像这样:

    [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;
      }
    }
    

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

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

我希望有人能理解我的问题并提供帮助。

提前致谢, 麦克

2 个答案:

答案 0 :(得分:0)

如果你正在使用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>

ViewModel看起来像这样:

ICommand UpdateSelectedItemCommand {get;set;}

..

UpdateSelectedItemCommand = new DelegateCommand( (param) =>
{
   State= (States) param;
});

将DelegateCommand替换为实现ICommand的自定义对象。

答案 1 :(得分:0)

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

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