将单选按钮绑定到特定对象列表中的枚举
本文关键字:列表 枚举 对象 单选按钮 绑定 | 更新日期: 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 的自定义对象。