2010-10-21 12 views
30

क्या किसी सूची में सूची बॉक्स को बाध्य करने के लिए ऑब्जेक्टडेटाप्रोवाइडर विधि का उपयोग करना संभव है, और किसी भी तरह से विवरण attriibute को प्रदर्शित करने के लिए शैली बनाना संभव है? यदि ऐसा है तो कोई ऐसा करने के लिए कैसे जाएगा ...?डब्ल्यूपीएफ एक सूची के लिए एक सूची बॉक्स को बाध्यकारी, विवरण विशेषता प्रदर्शित करना

+0

http://stackoverflow.com/questions/1281490/binding-comboboxes-to-enums-in-silverlight का संभावित डुप्लिकेट। –

उत्तर

79

हां, यह संभव है। यह यह करेगा। हम enum

public enum MyEnum 
{ 
    [Description("MyEnum1 Description")] 
    MyEnum1, 
    [Description("MyEnum2 Description")] 
    MyEnum2, 
    [Description("MyEnum3 Description")] 
    MyEnum3 
} 

फिर हम के रूप में

xmlns:MyEnumerations="clr-namespace:MyEnumerations" 
<ObjectDataProvider MethodName="GetValues" 
       ObjectType="{x:Type sys:Enum}" 
       x:Key="MyEnumValues"> 
    <ObjectDataProvider.MethodParameters> 
     <x:Type TypeName="MyEnumerations:MyEnum" /> 
    </ObjectDataProvider.MethodParameters> 
</ObjectDataProvider> 

और ListBox हम MyEnumValues ​​को ItemsSource सेट के लिए ObjectDataProvider का उपयोग करें और एक कनवर्टर के साथ एक ItemTemplate आवेदन कर सकते हैं है का कहना है।

<ListBox Name="c_myListBox" SelectedIndex="0" Margin="8" 
     ItemsSource="{Binding Source={StaticResource MyEnumValues}}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

और कनवर्टर में हम वर्णन मिलता है और इसे वापस

public class EnumDescriptionConverter : IValueConverter 
{ 
    private string GetEnumDescription(Enum enumObj) 
    { 
     FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString()); 

     object[] attribArray = fieldInfo.GetCustomAttributes(false); 

     if (attribArray.Length == 0) 
     { 
      return enumObj.ToString(); 
     } 
     else 
     { 
      DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute; 
      return attrib.Description; 
     } 
    } 

    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Enum myEnum = (Enum)value; 
     string description = GetEnumDescription(myEnum); 
     return description; 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.Empty; 
    } 
} 

GetEnumDescription विधि शायद कहीं और जाना चाहिए, लेकिन आप विचार :)

+0

धन्यवाद, यह अब आज़माएगा :) –

+4

इसे प्यार करो, इसे गेंक दिया। मैंने GetEnumDescription को जोड़ने के लिए थोड़ा लिनक का उपयोग किया, आप इसे यहां फेंक सकते हैं http://pastebin.com/XLm9hbhG – Will

+2

तो आपको प्रत्येक प्रकार के enum के लिए कनवर्टर बनाना होगा? – Carlo

2

यदि आप एनम से बंधे हैं, तो आप शायद इसे एक IValueConverter के माध्यम से विवरण में परिवर्तित कर सकते हैं।

इसे पूरा करने के तरीके के विवरण के लिए Binding ComboBoxes to enums... in Silverlight! देखें।

अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx देखें।

0

आप एक ressource फ़ाइल परिभाषित कर सकते हैं पाने के आपकी परियोजना में (* .resx फ़ाइल)। इस फाइल में आप इस तरह परिभाषित करना होगा "कुंजी-मान-जोड़े", कुछ:

"YellowCars" : "Yellow Cars", 
"RedCars" : "Red Cars", 

और इतने पर ...

चाबियाँ हैं अपने enum-प्रविष्टियों के बराबर होती है, कुछ इस तरह:

public enum CarColors 
{ 
    YellowCars, 
    RedCars 
} 

और इतने पर ...

आप WPF का उपयोग करते हैं तो आप अपने XAML-संहिता में कुछ इस तरह लागू कर सकते हैं,:

<ComboBox ItemsSource="{Binding Source={StaticResource CarColors}}" SelectedValue="{Binding CarColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Converter={StaticResource CarColorConverter}}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

तो फिर आप अपने कनवर्टर, कुछ इस तरह लिखना चाहिए:

using System; 
using System.Globalization; 
using System.Resources; 
using System.Windows.Data; 

public class CarColorConverter : IValueConverter 
{ 
    private static ResourceManager CarColors = new ResourceManager(typeof(Properties.CarColors)); 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var key = ((Enum)value).ToString(); 
     var result = CarColors.GetString(key); 
     if (result == null) { 
      result = key; 
     } 

     return result; 
    } 

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

मेरा जवाब 7 साल आता है देर से ;-) लेकिन शायद यह किसी और के द्वारा इस्तेमाल किया जा सकता है!

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^