【问题标题】:Binding converted Enum to a ComboBox将转换后的 Enum 绑定到 ComboBox
【发布时间】:2011-04-07 05:27:17
【问题描述】:

我尝试将以下 Enum 绑定到 ComboBox

Public Enum PossibleActions
  ActionRead
  ActionWrite
  ActionVerify
End Enum

我无法更改 Enum 本身,但我不想显示这些字符串。我的意图只是删除前缀“Action”并在 ComboBox 中显示“Read”、“Write”和“Verify”。因此我写了一个ValueConverter

Public Class PossibleActionsConverter
  Implements IValueConverter

      Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim actions() As PossibleActions
        Dim strings() As String

        actions = CType(value, PossibleActions())
        ReDim strings(actions.GetUpperBound(0))
        For i = 0 To actions.GetUpperBound(0)
          strings(i) = actions(i).ToString.Substring(6)
        Next
        Return strings
      End Function

      Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Dim s As String

        s = CStr(value)

        Return [Enum].Parse(GetType(PossibleActions), "Action" & s)
      End Function
    End Class

我的 XAML 看起来像

xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:StepEditor"

[...]

<Window.Resources>
    <ObjectDataProvider x:Key="possibleActionsEnum" MethodName="GetValues"
                        ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:TypeExtension Type="local:PossibleActions"></x:TypeExtension>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    <local:PossibleActionsConverter x:Key="possibleActionsConverter"></local:PossibleActionsConverter>
</Window.Resources>

[...]
要么:

<ComboBox ItemsSource="{Binding Source={StaticResource possibleActionsEnum}, Converter={StaticResource possibleActionsConverter}}"
          SelectedItem="{Binding SelectedAction}"></ComboBox>

或者:

<ComboBox ItemsSource="{Binding Source={StaticResource possibleActionsEnum}, Converter={StaticResource possibleActionsConverter}}"
          SelectedItem="{Binding SelectedAction, Converter={StaticResource possibleActionsConverter}}"></ComboBox>

我的问题是所选项目的绑定。它失败了,但我不知道为什么。

【问题讨论】:

    标签: wpf vb.net binding ivalueconverter


    【解决方案1】:

    SelectedItem 的绑定是错误的,因为你把你的 Enum 转换成 Strings,但是 SelectedItems 是一个单一的字符串。如果您想坚持这种架构,请编写一个转换器,将单个字符串转换回您的枚举。 现有转换器的 Convert 和 ConvertBack 方法接近解决方案。它们可能看起来像:

      Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim action As PossibleActions
    
        action = CType(value, PossibleActions)
        Return action.ToString.Substring(6)
      End Function
    
      Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Dim s As String
    
        s = CStr(value)
        Return [Enum].Parse(GetType(PossibleActions), "Action" & s)
      End Function
    

    【讨论】:

      【解决方案2】:

      这里 iMHO 的最佳解决方案是使用数据模板,因此您不必像上一个答案那样实现 2 个转换器(一个转换单个枚举,另一个转换数组)。使用数据模板,转换器可以单独应用于下拉列表的每个项目,因此不再需要转换数组的转换器。

       <ComboBox.ItemTemplate>
         <DataTemplate>
           <TextBlock Text="{Binding Converter={StaticResource possibleActionConverter}}" />
         </DataTemplate>
       </ComboBox.ItemTemplate>
      

      使用 possibleActionConverter 将单个枚举转换为字符串。

      HTH

      【讨论】:

        猜你喜欢
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 2012-03-10
        • 2012-09-26
        相关资源
        最近更新 更多