如何使用IValueConverter绑定枚举?

时间:2019-04-29 01:20:24

标签: wpf

这是枚举:

public enum BarcodeType
        { AZTEC, CODABAR, CODE128, CODE93, CODE39, DATA_MATRIX, EAN13, EAN8, ITF, MAXICODE, PDF417, QRCODE, RSS14, RSSEXPANDED, UPCA, UPCE, UPC_EAN_EXTENSION }

我将枚举绑定到ComboBox上,像这样:

<Page x:Class="KongGamLung.ToolProperty.BarCodeProperty"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:KongGamLung.ToolProperty"
      xmlns:System="clr-namespace:System;assembly=mscorlib"
      xmlns:Model="clr-namespace:KongGamLung.Models"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="BarCodeProperty">
    <Page.Resources>
        <ObjectDataProvider x:Key="dataFromEnum" MethodName="GetValues"
                            ObjectType="{x:Type System:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="Model:BarcodeModel+BarcodeType"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
        <local:BarcodeTypeConverter x:Key="BarcodeTypeConverter"/>
    </Page.Resources>
                    <ComboBox x:Name="BarcodeTypeCB" ItemsSource="{Binding Source={StaticResource dataFromEnum},Converter={StaticResource BarcodeTypeConverter}}">

                    </ComboBox>
</Page>

这是代码背后:

public class BarcodeTypeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {            
            return Enum.GetName(value.GetType(), value).ToString().Replace("_", " ");
        }

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

在没有IValueConverter的代码的情况下,代码可以很好地工作。

我使用IValueConverter是因为我想将枚举中的'_'字符替换为'',以使其看起来更好。

我按照https://social.msdn.microsoft.com/Forums/vstudio/en-US/43db6b07-f886-4214-8076-5a5ec2360616/valueconverter-that-converts-an-enum-value-to-its-corresponding-string-value?forum=wpf所说的那样对IValueConverter进行编码。但最后,它引发了System.ArgumentException错误。

我该如何解决?你能帮我吗?谢谢。

1 个答案:

答案 0 :(得分:1)

不要在ItemsSource上使用转换器,它会更改要绑定到的数据的类型。如果您需要更改枚举的外观,请改为指定ItemTemplate并在此处使用您的转换器:

<ComboBox ItemsSource="{Binding Source={StaticResource dataFromEnum}}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=., Converter={StaticResource BarcodeTypeConverter}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

我个人将绑定到一个既包含枚举又包含文本的中间视图模型类,这样就很容易支持本地化(即在运行时使用多种语言)。