我的枚举值类似于
HomeRun,StolenBase,FirstBase等
我想在组合框中显示这些值,在大写字母之前插入一个空格,因此它将显示为“Home Run”,“Stolen Base”等。
我已经有了可以为我做格式化的代码,并且我已将该代码添加到IValueConverter实现的'Convert'方法中。
我的问题是,我在哪里需要使用这个转换器(在xaml中),这样不仅下拉列表,而且显示的值,将具有这种格式?我是否还需要实现ConvertBack?
我很清楚为枚举设置“描述”并使用流行的EnumToDescriptionConverter,但我宁愿远离它。
答案 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
。
我个人会使用你提到的描述属性模式,因为
但假设你想要使用这种模式,你只需要正确地编写你的转换器。我建议这样的事情:
// 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>
。我会把它放在这里,因为它是一个正确方向的开始。
我相信您需要两个转换器
ConvertBack
方法。 正如我所指出的,如果你没有实现ConvertBack
,那么你将无法将SelectedValue绑定到ViewModel上的枚举属性。
答案 3 :(得分:0)
您需要创建一个字典或其他查找结构,将Enum值映射到字符串表示。
答案 4 :(得分:-1)
有一条提示可以作为开头使用:
http://geekswithblogs.net/jawad/archive/2005/06/24/EnumDropDown.aspx
我从这个想法开始,我开发了自己的枚举绑定助手。