我有一个项目(带有C#和XAML的WPF,使用MVVM),我认为转换器存在问题(来自IValueConverter)。由于我还没有找到问题的根源,所以我来这里问你善良的人。
我有两个用户控件。左侧是CharacterViewModel列表,右侧是CharacterFormViewModel的形式(两者基本相同)。如果单击列表中的某个项目,它会将CharacterViewModel发送到介体,该介体将其传递给窗体并显示它。它包括名字,姓氏,年龄和性别等详细信息。它工作正常。
我想做的一件事就是为Gender属性设置一个单选按钮而不是一个文本框。我也将原始文本框留在那里,就像备份一样。我放入了单选按钮(其中三个:男性,女性,其他),并使用转换器将它们绑定到表单上的视图模型。
让我在这里给出一些代码:
这是XAML的单选按钮部分:
<StackPanel Grid.Column="4" Grid.Row="3" Margin="3">
<RadioButton GroupName="CharacterGender" Content="Male" IsChecked="{Binding Gender, Converter={StaticResource ResourceKey=genderConverterKey}, ConverterParameter=M}" />
<RadioButton GroupName="CharacterGender" Content="Female" IsChecked="{Binding Gender, Converter={StaticResource ResourceKey=genderConverterKey}, ConverterParameter=F}" />
<RadioButton GroupName="CharacterGender" Content="Other" IsChecked="{Binding Gender, Converter={StaticResource ResourceKey=genderConverterKey}, ConverterParameter=O}"/>
</StackPanel>
我们在同一个用户控件中稍微进一步:
<UserControl.Resources>
<converters:GenderConverter x:Key="genderConverterKey" />
</UserControl.Resources>
当然,还有转换器本身:
class GenderConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((string)parameter == value.ToString());
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return parameter;
}
}
性别属于&#39; Char&#39;,我可以说转换器运行(我使用了断点)。它检查单选按钮的每个参数,检查视图模型,然后检查正确的模型。这似乎也有效。
问题:,这只发生在使用单选按钮和转换器时,而不是没有它们。问题在于,当我选择一个男性角色时,在这个过程的某个地方,他们会转为女性。
我可以提供更多相关信息,因为我已经看了一段时间。
有些东西似乎在调用这段代码,但由于某些原因我无法说出:
public char Gender
{
get { return Character.Gender; }
set
{
if (Character.Gender != value)
{
Character.Gender = value;
MessageBox.Show("Changing character to: " + value.ToString());
RaisePropertyChanged("Gender");
}
}
}
它只是一个包装,并不是什么特别的东西。如果我选择女性,则会弹出一次消息框并说“将字符更改为:F&#39;”。如果我选择男性,它会说“将角色改为:M&#39;然后直接(并且没有做任何事情),再次弹出“将角色改为:F&#39;”。所以男性角色肯定是男性角色,但某些东西在某个地方发生了变化。
This image显示了来自我的几个笔记的调用堆栈。我不知道&#39;外部代码&#39;正在做,但它似乎正在重置性别。
要确认:如果我删除了单选按钮和转换器,即在我只是使用常规文本框显示Gender的情况下,就不会发生这种情况。现在我有一个单选按钮和一个文本框。可以使用所述文本框设置性别数据,因为它是可编辑的,但我不做任何事情。
我希望我在这里提供足够的信息来帮助别人帮助我。如果没有,我可以提供更多。
我尝试了一些显而易见的事情:我删除了现有的性别文本框,因为它不知何故导致并更新了该属性。问题依然存在。我也尝试过选择所有男性角色(有三个),每个角色都存在问题。
感谢阅读。
答案 0 :(得分:1)
据我所知,您的ConvertBack返回参数而不考虑实际的IsChecked
值。
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((bool)value)
return parameter;
return Binding.DoNothing;
}
请尝试,也许我忽略了不同的东西。