【问题标题】:How to pass specific value to the converter parameter?如何将特定值传递给转换器参数?
【发布时间】:2011-08-07 20:19:27
【问题描述】:

我创建了一个类 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>

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

我不知道如何让转换器参数分别为第一个、第二个和第三个单选按钮传递Person.GenderType.FemalePerson.GenderType.Malenull

【问题讨论】:

    标签: .net wpf xaml binding converter


    【解决方案1】:

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

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

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

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

    -

    GenderType gender = (GenderType)Enum.Parse(typeof(GenderType), parameter.ToString());
    

    【讨论】:

      【解决方案2】:

      既然您要创建自己的转换器,为什么不直接发送一个可为空的布尔值作为转换器参数?

      所以male,female,not specified发送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}"/>
      

      用于您的单选按钮。

      【讨论】:

      • 出于几个原因,我不会将枚举投射到三叉戟 - 它掩盖了枚举的预期含义,它使代码的可读性降低(即“男性”是真还是假?为什么?)并且它限制了枚举的扩展可能性(或在将来扩展枚举时引入问题)。
      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多