2011-04-07 140 views
6

我试着以下枚举绑定到组合框绑定转换枚举到一个ComboBox

Public Enum PossibleActions 
    ActionRead 
    ActionWrite 
    ActionVerify 
End 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> 

Or:

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

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

回答

3

SelectedItem的绑定是错误的,因为您将Enum转换为字符串,但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 
1

最好的解决办法在这里恕我直言,是使用数据模板,这样你就不必实现2个转换器,在前面的答案(一个将单枚举,而另一个转换数组)。使用数据完成时,可以将转换器分别应用于每个下拉列表项,因此不再需要转换数组的转换器。

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

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

HTH