我有以下情况:
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
列表,在更改所选项目时,也应更改所选的单选按钮。
我希望有人能理解我的问题并提供帮助。
提前致谢, 麦克
答案 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时(即将选择更改为非默认值后)正确更新单选按钮以反映最新值。
我认为你在项目中还有其他干扰因素,你应该尝试取出解决方案并单独测试它们。