用于枚举的Combobox转换器

时间:2011-10-26 21:34:40

标签: c# .net wpf enums ivalueconverter

我的枚举值类似于

HomeRun,StolenBase,FirstBase等

我想在组合框中显示这些值,在大写字母之前插入一个空格,因此它将显示为“Home Run”,“Stolen Base”等。

我已经有了可以为我做格式化的代码,并且我已将该代码添加到IValueConverter实现的'Convert'方法中。

我的问题是,我在哪里需要使用这个转换器(在xaml中),这样不仅下拉列表,而且显示的值,将具有这种格式?我是否还需要实现ConvertBack?

我很清楚为枚举设置“描述”并使用流行的EnumToDescriptionConverter,但我宁愿远离它。

5 个答案:

答案 0 :(得分:7)

我不确定是否有更好的方法,但你可以使用ItemTemplate实现你想要的东西

<ComboBox.ItemTemplate>
    <DataTemplate>
        <ContentPresenter
            Content="{Binding Converter={StaticResource baseballEnumConverter}}"/>
     </DataTemplate>
</ComboBox.ItemTemplate>

这将在ComboBox中显示转换后的值。

ComboBox的SelectedValue仍然是Enum值。您不需要实现ConvertBack。

答案 1 :(得分:2)

[更新] 我的回答的关键点是枚举值完全转换。我认为这种方式比转换每个枚举值更为明显。 [/ updated]

  

我在哪里需要使用此转换器(在xaml中),这样不仅下拉列表,而且显示的值,将具有此   格式化?

在ComboBox的Binding ItemsSource ItemsSource="{Binding Source={x:Null}, Converter={StaticResource converter}}"),请检查以下代码。

  

我是否还需要实现ConvertBack?

不,你没有。,因为在运行时你不能修改枚举,即使它可以做,你也不能在VIEW中更改ComboBox的ItemsSource,这意味着绑定模式是OneWay。

XAML

<Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:MyEnumConverter x:Key="converter"/>
    </Window.Resources>
    <StackPanel>
        <ComboBox ItemsSource="{Binding Source={x:Null}, Converter={StaticResource converter}, Mode=OneWay}"></ComboBox>
    </StackPanel>
</Window>

代码

public enum MyEnum
{
    HomeRun, StolenBase, FirstBase
}

[ValueConversion(typeof(object), typeof(List<string>))]
public class MyEnumConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var names = Enum.GetNames(typeof (MyEnum)).ToArray();
        //Add some code to support the thing you want to do(add blank in front of Capital...)
        return names;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

答案 2 :(得分:1)

如果您希望将选定的ComboBox值转换回到枚举,那么您需要实现ConvertBack

我个人会使用你提到的描述属性模式,因为

  1. 已经提出了明显的问题,
  2. 您不仅限于以大写字母插入空格 - 您可以使用您想要的任何描述。
  3. 但假设你想要使用这种模式,你只需要正确地编写你的转换器。我建议这样的事情:

    // Convert method
    var formattedNames = new List<string>();
    foreach (var value in Enum.GetValues(typeof(Things)))
    {
        // Format is a method to convert the enum value to the display string
        var formattedName = Format(value);
        formattedNames.Add(formattedName);
    }
    // return a list of strings that you can bind to
    return formattedNames;
    
    // ConvertBack method
    // Unformat is a method to revert the display string back to the enum value
    var value = Unformat(formattedValue);
    return Enum.Parse(typeof(Things), value);
    

    您还可以创建一个简单的类来同时保存显示值和枚举,然后在组合框上相应地设置DisplayPath属性

    class DisplayEnum
    {
        public string DisplayValue { get;set; }
        public MyEnum ActualValue { get;set; }
    }
    
    <ComboBox DisplayMemberPath=DisplayValue ...
    

    修改

    我意识到这不起作用,因为ConvertBack正在尝试将字符串转换为枚举,但实际的绑定集是List<string>。我会把它放在这里,因为它是一个正确方向的开始。

    我相信您需要两个转换器

    1. 将枚举类型转换为一组枚举值,
    2. 将枚举值转换为字符串。第二个转换器应该实现ConvertBack方法。
    3. 正如我所指出的,如果你没有实现ConvertBack ,那么你将无法将SelectedValue绑定到ViewModel上的枚举属性。

答案 3 :(得分:0)

您需要创建一个字典或其他查找结构,将Enum值映射到字符串表示。

答案 4 :(得分:-1)

有一条提示可以作为开头使用:

http://geekswithblogs.net/jawad/archive/2005/06/24/EnumDropDown.aspx

我从这个想法开始,我开发了自己的枚举绑定助手。