包含单选按钮的ListBox - 仅最后一个更新

时间:2018-02-14 15:48:36

标签: c# wpf listbox radio-button

好吧,所以我在我的项目中使用的WPF单选按钮控件有问题(WPF,C#,MVVM Light)。

我有一个ListBox,每个ListBoxItem都有一个模板。每个模板中都有一组单选按钮。单选按钮的IsChecked'链接到ListBoxItem数据上下文中的属性。

那部分看起来像这样:

<StackPanel Margin="2" Grid.Row="0" Grid.Column="3">
                            <RadioButton GroupName="VerbType" Content="Ichidan" IsChecked="{Binding VerbType, Converter={StaticResource ResourceKey=GenericRadioButtonConverter}, ConverterParameter=0}" />
                            <RadioButton GroupName="VerbType" Content="Godan" IsChecked="{Binding VerbType, Converter={StaticResource ResourceKey=GenericRadioButtonConverter}, ConverterParameter=1}" />
                            <RadioButton GroupName="VerbType" Content="Irregular" IsChecked="{Binding VerbType, Converter={StaticResource ResourceKey=GenericRadioButtonConverter}, ConverterParameter=2}" />
                            <RadioButton GroupName="VerbType" Content="Suru" IsChecked="{Binding VerbType, Converter={StaticResource ResourceKey=GenericRadioButtonConverter}, ConverterParameter=3}" />
                        </StackPanel>

所以属性是VerbType,它可以是0,1,2或3(int类型)。

我使用的转换器如下:

class GenericRadioButtonConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (parameter.ToString() == value.ToString());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (bool)value ? parameter : System.Windows.Data.Binding.DoNothing;
    }
}

究竟出了什么问题?当您启动程序时,它不会显示基础视图模型中的数据 - 所有四个单选按钮都将为空白。这不适用于ListBox中的最终ListBoxItem,它以某种方式工作正常。

您可能认为数据可能不会在以前的视图模型中设置,这些视图模型是其他ListBoxItems的数据上下文。好吧,我想到了这一点,我回到程序的一部分,从XML文件加载数据。我强迫他们所有人都是&#39; 1。它没有区别,除了最后一项 - 在这种情况下,单选按钮反映了这一变化。它确实按照我的预期运行了这部分代码。

它适用于输入:如果我单击其中一个单选按钮,它将转到VerbType属性的setter并给出正确的。此时,我点击的那个将被选中。

它刚刚起步。为什么只有最后一个加载?

最后一个明显的问题可能是最后一个问题的差异。数据中有什么不同之处吗?好吧,检查一下,我在数据中添加了一个。正如预期的那样,它显示为ListBox中的新最终项目。显示了它的初始单选按钮状态,但之前的最后一个没有。

为什么会出现这种情况我不知道,但希望有人可以就此问题分享一些智慧。

1 个答案:

答案 0 :(得分:0)

我找到了答案。

似乎密钥位于GroupName属性中。正如我的问题所示,我有四个单选按钮,其中有五个(每个ListBoxItem四个)。因为它们都具有相同的GroupName,所以它们将它们视为一个20个单组,而不是五个四个组。

解决方案是给五组不同的GroupNames。现在在我的情况下,Radio Buttons在一个模板中,所以我不能只将GroupName更改为另一个String,否则我再次遇到同样的问题。所以我所做的是将GroupName属性绑定到ListBoxItem的数据上下文的一个属性,我知道这对于列表中的每个项都是唯一的。每个ListBoxItem都称为LanguageItem(即数据上下文),每个LanguageItem都有一个唯一的ID。所以我将这个ID属性绑定到GroupName,它起了作用。