好吧,所以我在我的项目中使用的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中的新最终项目。显示了它的初始单选按钮状态,但之前的最后一个没有。
为什么会出现这种情况我不知道,但希望有人可以就此问题分享一些智慧。
答案 0 :(得分:0)
我找到了答案。
似乎密钥位于GroupName属性中。正如我的问题所示,我有四个单选按钮,其中有五个(每个ListBoxItem四个)。因为它们都具有相同的GroupName,所以它们将它们视为一个20个单组,而不是五个四个组。
解决方案是给五组不同的GroupNames。现在在我的情况下,Radio Buttons在一个模板中,所以我不能只将GroupName更改为另一个String,否则我再次遇到同样的问题。所以我所做的是将GroupName属性绑定到ListBoxItem的数据上下文的一个属性,我知道这对于列表中的每个项都是唯一的。每个ListBoxItem都称为LanguageItem(即数据上下文),每个LanguageItem都有一个唯一的ID。所以我将这个ID属性绑定到GroupName,它起了作用。