2011-04-07 23 views
6

मैं कोई ComboBoxकोई ComboBox

Public Enum PossibleActions 
    ActionRead 
    ActionWrite 
    ActionVerify 
End Enum 

मैं Enum खुद को बदल नहीं सकते के लिए निम्न Enum बाध्य करने की कोशिश की करने के लिए परिवर्तित Enum बाइंडिंग, लेकिन मैं इन तार प्रदर्शित करने के लिए नहीं करना चाहती। मेरा इरादा कॉम्बोबॉक्स में उपसर्ग 'एक्शन' और 'रीड', 'लिखें' और 'सत्यापित' प्रदर्शित करना है। इसलिए मैंने लिखा एक 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> 

मेरी समस्या चयनित आइटम का बाध्यकारी है। यह विफल रहता है, लेकिन मैं समझ नहीं सकता क्यों।

उत्तर

3

चयनित इटैम का बाध्यकारी गलत है, क्योंकि आप अपने एनम को स्ट्रिंग्स में कनवर्ट करते हैं, लेकिन चयनित इटम्स एक स्ट्रिंग है। यदि आप इस आर्किटेक्चर पर चिपकना चाहते हैं, तो एक कनवर्टर लिखें जो एक सिंगल स्ट्रिंग को आपके एनम में बदल देता है। कनवर्ट और कन्वर्ट बैक-विधियां आपके मौजूदा कनवर्टर के समाधान के करीब हैं। वे देख सकते हैं जैसे:

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

सबसे अच्छा समाधान यहाँ IMHO एक डेटा टेम्पलेट का उपयोग करने के लिए है, तो आप पिछले जवाब में (एक है कि एक ही enum धर्मान्तरित के रूप में 2 कन्वर्टर्स को लागू करने की जरूरत नहीं है, और दूसरा वह जिसमें एक सरणी बदलता है)। डेटामैप्लेट का उपयोग करके, कनवर्टर अलग-अलग ड्रॉप डाउन के प्रत्येक आइटम पर लागू किया जा सकता है, इसलिए एक सरणी को परिवर्तित करने वाला कनवर्टर अब आवश्यक नहीं है।

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

संभवएक्शनएक्शन कनवर्टर के साथ एक सिंगल एनम को स्ट्रिंग में परिवर्तित करना।

एचटीएच