如何将特定值传递给转换器参数?

Bor*_*ris 49 .net wpf xaml binding converter

我创建了一个类似于此的Person:

public class Person
{
    public enum GenderType
    {
        Female, 
        Male
    }

    public string Name
    {
        get; set;
    }

    public GenderType? Gender
    {
        get; set;
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我创建了将呈现Person类型对象的数据模板.
这是XAML代码:

<DataTemplate 
    x:Key="personTemplate" 
    DataType="{x:Type model:Person}">
  <StackPanel>
    <RadioButton 
        Content="Female" 
        IsChecked="{Binding Path=Gender, 
                    Converter={StaticResource genderConverter}, 
                    ConverterParameter=???}"/>
    <RadioButton 
        Content="Male" 
        IsChecked="{Binding Path=Gender, 
                    Converter={StaticResource genderConverter}, 
                    ConverterParameter=???}"/>
    <RadioButton 
        Content="Not specified" 
        IsChecked="{Binding Path=Gender, 
                    Converter={StaticResource genderConverter}, 
                    ConverterParameter=???}"/>
  </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

当然???代码中的s不起作用:)问题是我想创建一个genderConverter转换器,它将比较给定值,即与参数中提供personObject.Gender的给定Person.GenderType值相比较,true如果值匹配则返回.

我不知道如何使转换器参数通过Person.GenderType.Female,Person.GenderType.Male并且分别null对于第一,第二和第三单选按钮.

Pav*_*kov 77

尝试使用x:Static标记扩展:

<RadioButton 
        Content="Female" 
        IsChecked="{Binding Path=Gender, 
                    Converter={StaticResource genderConverter}, 
                    ConverterParameter={x:Static model:GenderType.Female}}"/>
Run Code Online (Sandbox Code Playgroud)

或者,您可以只传递一个字符串并用于Enum.Parse将该字符串转换为转换器中的枚举类型:

<RadioButton 
        Content="Female" 
        IsChecked="{Binding Path=Gender, 
                    Converter={StaticResource genderConverter}, 
                    ConverterParameter=Female}"/>
Run Code Online (Sandbox Code Playgroud)

-

GenderType gender = (GenderType)Enum.Parse(typeof(GenderType), parameter.ToString());
Run Code Online (Sandbox Code Playgroud)


Jos*_*ose 7

既然你正在创建自己的转换器,为什么不直接发送一个可空的bool作为转换器参数?

所以male,female,not specified发送true,false,null.

如果您不想这样做,则必须在开头引用您的命名空间,如下所示:

xmlns:myNamespace="clr-namespace:MyNamespace"
Run Code Online (Sandbox Code Playgroud)

然后

<RadioButton 
    Content="Male" 
    IsChecked="{Binding Path=Gender, 
                Converter={StaticResource genderConverter}, 
                ConverterParameter=x:Static myNamespace:Person.GenderType.Male}"/>
Run Code Online (Sandbox Code Playgroud)

为您的radiobuttons.

  • 我不会将枚举转换为三元组,原因有几个 - 它模糊了枚举的预期含义,它使代码的可读性较差(即“男性”是真还是假?为什么?)并且它限制了枚举的扩展可能性枚举(或者在将来扩展枚举时引入问题)。 (3认同)