Как передать конкретное значение в параметр конвертера? - PullRequest
47 голосов
/ 18 апреля 2011

Я создал класс Person, который выглядит следующим образом:

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

    public string Name
    {
        get; set;
    }

    public GenderType? Gender
    {
        get; set;
    }
}

Далее я создал шаблон данных, который будет представлять объекты типа 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>

Конечно, ??? в коде не будут работать :) Проблема в том, что я хочу создать genderConverter преобразователь, который будет сравнивать заданное значение, т.е. значение, указанное в параметре, и возвращает true, если значения совпадают.

Я не знаю, как заставить параметр преобразователя передавать Person.GenderType.Female, Person.GenderType.Male и null для первого, второго и третьего переключателя, соответственно.

Ответы [ 2 ]

74 голосов
/ 18 апреля 2011

Попробуйте использовать x:Static расширение разметки:

<RadioButton 
        Content="Female" 
        IsChecked="{Binding Path=Gender, 
                    Converter={StaticResource genderConverter}, 
                    ConverterParameter={x:Static model:GenderType.Female}}"/>

ИЛИ, вы можете просто передать строку и использовать Enum.Parse для преобразования этой строки в тип enum в конвертере:

<RadioButton 
        Content="Female" 
        IsChecked="{Binding Path=Gender, 
                    Converter={StaticResource genderConverter}, 
                    ConverterParameter=Female}"/>

-

GenderType gender = (GenderType)Enum.Parse(typeof(GenderType), parameter.ToString());
6 голосов
/ 18 апреля 2011

Поскольку вы создаете свой собственный конвертер, почему бы вам просто не отправить в качестве параметра конвертера значение nullable bool?

, поэтому для male,female,not specified send true,false,null.

если вы не хотите этого делать, вам сначала нужно будет сослаться на свое пространство имен следующим образом:

xmlns:myNamespace="clr-namespace:MyNamespace"

, а затем

<RadioButton 
    Content="Male" 
    IsChecked="{Binding Path=Gender, 
                Converter={StaticResource genderConverter}, 
                ConverterParameter=x:Static myNamespace:Person.GenderType.Male}"/>

для своих радиокнопок.

...