带转换器的WPF单选按钮 - 我的所有角色如何成为女性

时间:2017-04-07 10:23:30

标签: c# wpf xaml mvvm

我有一个项目(带有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的情况下,就不会发生这种情况。现在我有一个单选按钮和一个文本框。可以使用所述文本框设置性别数据,因为它是可编辑的,但我不做任何事情。

我希望我在这里提供足够的信息来帮助别人帮助我。如果没有,我可以提供更多。

我尝试了一些显而易见的事情:我删除了现有的性别文本框,因为它不知何故导致并更新了该属性。问题依然存在。我也尝试过选择所有男性角色(有三个),每个角色都存在问题。

感谢阅读。

1 个答案:

答案 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;
}

请尝试,也许我忽略了不同的东西。