Привязка преобразованного Enum к ComboBox - PullRequest
6 голосов
/ 07 апреля 2011

Я пытался привязать следующий Enum к ComboBox

Public Enum PossibleActions
  ActionRead
  ActionWrite
  ActionVerify
End Enum

Я не могу изменить сам Enum, но я не хочу отображать эти строки. Мое намерение состоит в том, чтобы просто сократить префикс «Действие» и отобразить «Чтение», «Запись» и «Проверка» в ComboBox. Поэтому я написал 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>

Моя проблема - привязка выбранного элемента. Не получается, но я не могу понять, почему.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Привязка 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
1 голос
/ 05 мая 2011

Лучшее решение здесь iMHO - использовать шаблон данных, поэтому вам не нужно реализовывать 2 конвертера, как в предыдущем ответе (один, который преобразует одно перечисление, а другой - массив).С помощью файла данных конвертер можно применить к каждому элементу раскрывающегося списка по отдельности, поэтому конвертер, который преобразует массив, больше не нужен.

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

с возможнымActionConverter, конвертирующим одно перечисление в строку.

HTH

...