ডাব্লুপিএফ-এর একটি কম্বোবক্সে একটি এনাম সম্পত্তি ডেটাবাইন্ডিং


256

উদাহরণ হিসাবে নিম্নলিখিত কোডটি গ্রহণ করুন:

public enum ExampleEnum { FooBar, BarFoo }

public class ExampleClass : INotifyPropertyChanged
{
    private ExampleEnum example;

    public ExampleEnum ExampleProperty 
    { get { return example; } { /* set and notify */; } }
}

আমি কোনও কম্বোবক্সের উদাহরণস্বরূপ সম্পত্তিটি ডেটাবাইন্ড করতে চাই, যাতে এটি "FooBar" এবং "বারফু" বিকল্পগুলি দেখায় এবং টুওয়ে মোডে কাজ করে। সর্বোত্তমভাবে আমি আমার কম্বোবক্স সংজ্ঞাটি এর মতো দেখতে চাই:

<ComboBox ItemsSource="What goes here?" SelectedItem="{Binding Path=ExampleProperty}" />

বর্তমানে আমার কাছে উইন্ডোতে কম্বোবক্স.সিলিপেশন চেঞ্জড এবং উদাহরণ ক্লাস.প্রপার্টিচেনজড ইভেন্টগুলি ইনস্টল করা আছে যেখানে আমি নিজেই বাঁধাই করি।

এর চেয়ে ভাল বা কোনও ধরণের ক্যানোনিকাল উপায় আছে কি? আপনি কি সাধারণত কনভার্টার ব্যবহার করেন এবং কীভাবে আপনি সঠিক মান সহ কম্বোবক্সকে জনপ্রিয় করবেন? আমি এখনই আই 18 এন দিয়ে শুরু করতে চাই না।

সম্পাদন করা

সুতরাং একটি প্রশ্নের উত্তর দেওয়া হয়েছিল: আমি কীভাবে সঠিক মানগুলি সহ কম্বোবক্সকে জনপ্রিয় করব।

স্ট্যাটিক এনাম.গেটভ্যালুস পদ্ধতি থেকে অবজেক্টডেটাপ্রোভাইডারের মাধ্যমে স্ট্রিংগুলির তালিকা হিসাবে এনাম মানগুলি পুনরুদ্ধার করুন:

<Window.Resources>
    <ObjectDataProvider MethodName="GetValues"
        ObjectType="{x:Type sys:Enum}"
        x:Key="ExampleEnumValues">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="ExampleEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

এটি আমি আমার কম্বোবক্সের জন্য আইটেমসোর্স হিসাবে ব্যবহার করতে পারি:

<ComboBox ItemsSource="{Binding Source={StaticResource ExampleEnumValues}}"/>

4
আমি এটি অন্বেষণ করেছি এবং এর সমাধান রয়েছে যা আপনি এখানে অবস্থিত ডাব্লুএফএফে (স্থানীয়করণের সাথে সম্পূর্ণ) ব্যবহার করতে পারেন ।
এজেকট্রেড

উত্তর:


208

আপনি একটি কাস্টম মার্কআপ এক্সটেনশন তৈরি করতে পারেন।

ব্যবহারের উদাহরণ:

enum Status
{
    [Description("Available.")]
    Available,
    [Description("Not here right now.")]
    Away,
    [Description("I don't have time right now.")]
    Busy
}

আপনার এক্সএএমএল শীর্ষে:

    xmlns:my="clr-namespace:namespace_to_enumeration_extension_class

এবং তারপর...

<ComboBox 
    ItemsSource="{Binding Source={my:Enumeration {x:Type my:Status}}}" 
    DisplayMemberPath="Description" 
    SelectedValue="{Binding CurrentStatus}"  
    SelectedValuePath="Value"  /> 

এবং বাস্তবায়ন ...

public class EnumerationExtension : MarkupExtension
  {
    private Type _enumType;


    public EnumerationExtension(Type enumType)
    {
      if (enumType == null)
        throw new ArgumentNullException("enumType");

      EnumType = enumType;
    }

    public Type EnumType
    {
      get { return _enumType; }
      private set
      {
        if (_enumType == value)
          return;

        var enumType = Nullable.GetUnderlyingType(value) ?? value;

        if (enumType.IsEnum == false)
          throw new ArgumentException("Type must be an Enum.");

        _enumType = value;
      }
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
      var enumValues = Enum.GetValues(EnumType);

      return (
        from object enumValue in enumValues
        select new EnumerationMember{
          Value = enumValue,
          Description = GetDescription(enumValue)
        }).ToArray();
    }

    private string GetDescription(object enumValue)
    {
      var descriptionAttribute = EnumType
        .GetField(enumValue.ToString())
        .GetCustomAttributes(typeof (DescriptionAttribute), false)
        .FirstOrDefault() as DescriptionAttribute;


      return descriptionAttribute != null
        ? descriptionAttribute.Description
        : enumValue.ToString();
    }

    public class EnumerationMember
    {
      public string Description { get; set; }
      public object Value { get; set; }
    }
  }

7
@ গ্রেগর এস আমার: গণনাটি কী?
জোশুয়া

14
@ ক্রাউন 'মাই' হ'ল নেমস্পেস প্রিফিক্স যা আপনি আপনার xaml ফাইলের শীর্ষে ঘোষণা করেছেন: উদাহরণস্বরূপ xmlns: my = "clr-namespace: namespace_to_enumeration_extension_class En ।
গ্রেগোর স্লাভেক

33
+1, তবে সহজ জিনিসগুলি সম্পাদন করতে ডাব্লুপিএফ দ্বারা প্রয়োজনীয় কোডের পরিমাণটি আসলেই হেডস্পিনিং
কনরাড মোরাওস্কি

1
এটি আপনার মডেলের কোনও অংশের জন্য একটি রেফারেন্স - প্যারামে, গণনার ধরন - ব্যবহারের উপায়টি সত্যই পছন্দ করে না ItemsSource। দৃষ্টিভঙ্গিটি এবং মডেলটিকে ডিউপলড রাখার জন্য, আমি দু'জনের মধ্যে অনুবাদ করার জন্য ভিউমোডেল এবং কোড ভিউমোডেলে অঙ্কের একটি অনুলিপি তৈরি করতে হবে ... যা সমাধানটিকে এত সহজ নয় would বা ভিউমোডেল থেকে টাইপটি নিজেই সরবরাহ করার কোনও উপায় আছে?
প্রদীপ

6
আর একটি সীমাবদ্ধতা হ'ল যদি আপনার একাধিক ভাষা থাকে তবে আপনি এটি করতে পারবেন না।
রিভার-ক্লেয়ার উইলিয়ামসন

176

ভিউ মডেলে আপনি থাকতে পারেন:

public MyEnumType SelectedMyEnumType 
{
    get { return _selectedMyEnumType; }
    set { 
            _selectedMyEnumType = value;
            OnPropertyChanged("SelectedMyEnumType");
        }
}

public IEnumerable<MyEnumType> MyEnumTypeValues
{
    get
    {
        return Enum.GetValues(typeof(MyEnumType))
            .Cast<MyEnumType>();
    }
}

এক্সএএমএল-এ ItemSourceবাঁধাই হয় MyEnumTypeValuesএবং SelectedItemআবদ্ধ হয় SelectedMyEnumType

<ComboBox SelectedItem="{Binding SelectedMyEnumType}" ItemsSource="{Binding MyEnumTypeValues}"></ComboBox>

এটি আমার ইউনিভার্সাল অ্যাপে অবিশ্বাস্যভাবে কাজ করেছে এবং এটি কার্যকর করা খুব সহজ ছিল। ধন্যবাদ!
নাথান স্ট্রুটজ

96

আমি ইউআই তে এনামের নাম ব্যবহার না করা পছন্দ করি। আমি ব্যবহারকারীর জন্য আলাদা মান ( DisplayMemberPath) এবং মানের জন্য আলাদা (এই ক্ষেত্রে এনাম) ( SelectedValuePath) পছন্দ করি prefer এই দুটি মান KeyValuePairঅভিধানে প্যাক এবং সংরক্ষণ করা যেতে পারে ।

XAML

<ComboBox Name="fooBarComboBox" 
          ItemsSource="{Binding Path=ExampleEnumsWithCaptions}" 
          DisplayMemberPath="Value" 
          SelectedValuePath="Key"
          SelectedValue="{Binding Path=ExampleProperty, Mode=TwoWay}" > 

সি শার্প

public Dictionary<ExampleEnum, string> ExampleEnumsWithCaptions { get; } =
    new Dictionary<ExampleEnum, string>()
    {
        {ExampleEnum.FooBar, "Foo Bar"},
        {ExampleEnum.BarFoo, "Reversed Foo Bar"},
        //{ExampleEnum.None, "Hidden in UI"},
    };


private ExampleEnum example;
public ExampleEnum ExampleProperty
{
    get { return example; }
    set { /* set and notify */; }
}

সম্পাদনা: এমভিভিএম প্যাটার্নের সাথে সামঞ্জস্যপূর্ণ।


14
আমি মনে করি আপনার উত্তরটি আন্ডাররেটেড হয়েছে, কম্বোবক্স নিজেই যা প্রত্যাশা করেছে তা দেওয়া সর্বোত্তম বিকল্প বলে মনে হচ্ছে। সম্ভবত আপনি ব্যবহারকারীকে অভিধান অভিধান তৈরি করতে পারেন Enum.GetValues, তবে নামটির অংশটি প্রদর্শিত হবে না। শেষ পর্যন্ত এবং বিশেষত যদি I18n বাস্তবায়িত হয় তবে এনামগুলি যাইহোক পরিবর্তিত হলে আপনাকে ম্যানুয়ালি স্টাফ পরিবর্তন করতে হবে। তবে এনামগুলি প্রায়শই পরিবর্তিত হওয়ার কথা নয়, যদি আদৌ হয় তবে সেগুলি হয়? +1
হেলটনবাইকার

2
এই উত্তরটি দুর্দান্ত এবং এটি এনামগুলির বিবরণ স্থানীয়করণ করতে দেয় ... এর জন্য ধন্যবাদ!
শায়ে

2
এই সমাধানটি খুব ভাল কারণ এটি অন্যান্য সমাধানগুলির চেয়ে কম কোড সহ এনাম এবং স্থানীয়করণ উভয়ই পরিচালনা করে!
এইচএফএন

2
অভিধানে সমস্যাটি হ'ল কীগুলি হ্যাশ মান দ্বারা অর্ডার করা হয় যাতে এর উপর খুব কম নিয়ন্ত্রণ থাকে। যদিও আরও কিছুটা ভার্বোজ, আমি তার পরিবর্তে তালিকা <কীভ্যালিউপায়ার <এনাম, স্ট্রিং >> ব্যবহার করেছি। চমৎকার ধারণা.
কেভিন ব্রক

3
@ কোপারনিক @ প্রাগমেটেক নতুন ফিক্স:public Dictionary<ExampleEnum, string> ExampleEnumsWithCaptions { get; } = new Dictionary<ExampleEnum, string>() { {ExampleEnum.FooBar, "Foo Bar"}, {ExampleEnum.BarFoo, "Reversed Foo Bar"}, //{ExampleEnum.None, "Hidden in UI"}, };
জিনজিনভ

40

আমি জানি না কেবল এক্সএএমএল-তে এটি সম্ভব কিনা তবে নিম্নলিখিতগুলি চেষ্টা করে দেখুন:

আপনার কম্বোবক্সকে এমন একটি নাম দিন যাতে আপনি এটি কোডবিহাইডে অ্যাক্সেস করতে পারেন: "প্রকারের কম্বোবক্স 1"

এখন নিম্নলিখিত চেষ্টা করুন

typesComboBox1.ItemsSource = Enum.GetValues(typeof(ExampleEnum));

24

এজেক্র্যাপড দ্বারা সরবরাহিত স্বীকৃত তবে এখন মুছে ফেলা উত্তরের ভিত্তিতে আমি আরও কিছু উন্নত বৈশিষ্ট্য ছাড়াই একটি স্লিমড ডাউন সংস্করণ তৈরি করেছি। সমস্ত কোড আপনাকে এখানে অনুলিপি করে কপি-পেস্ট করার অনুমতি দেয় এবং লিংক-রট দ্বারা অবরুদ্ধ না হয়ে যায়।

আমি System.ComponentModel.DescriptionAttributeসত্যই ডিজাইন সময় বিবরণ জন্য উদ্দেশ্য যা ব্যবহার । আপনি যদি এই বৈশিষ্ট্যটি ব্যবহার করতে অপছন্দ করেন তবে আপনি নিজের তৈরি করতে পারেন তবে আমার মনে হয় এই বৈশিষ্ট্যটি ব্যবহার করা সত্যিই কাজটি সম্পন্ন করে। আপনি যদি বৈশিষ্ট্যটি ব্যবহার না করেন তবে নামটি কোডের এনাম মানটির নামে ডিফল্ট হবে।

public enum ExampleEnum {

  [Description("Foo Bar")]
  FooBar,

  [Description("Bar Foo")]
  BarFoo

}

এখানে আইটেমগুলির উত্স হিসাবে ব্যবহৃত ক্লাসটি রয়েছে:

public class EnumItemsSource : Collection<String>, IValueConverter {

  Type type;

  IDictionary<Object, Object> valueToNameMap;

  IDictionary<Object, Object> nameToValueMap;

  public Type Type {
    get { return this.type; }
    set {
      if (!value.IsEnum)
        throw new ArgumentException("Type is not an enum.", "value");
      this.type = value;
      Initialize();
    }
  }

  public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) {
    return this.valueToNameMap[value];
  }

  public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) {
    return this.nameToValueMap[value];
  }

  void Initialize() {
    this.valueToNameMap = this.type
      .GetFields(BindingFlags.Static | BindingFlags.Public)
      .ToDictionary(fi => fi.GetValue(null), GetDescription);
    this.nameToValueMap = this.valueToNameMap
      .ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
    Clear();
    foreach (String name in this.nameToValueMap.Keys)
      Add(name);
  }

  static Object GetDescription(FieldInfo fieldInfo) {
    var descriptionAttribute =
      (DescriptionAttribute) Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
    return descriptionAttribute != null ? descriptionAttribute.Description : fieldInfo.Name;
  }

}

আপনি এটি XAML তে এটি ব্যবহার করতে পারেন:

<Windows.Resources>
  <local:EnumItemsSource
    x:Key="ExampleEnumItemsSource"
    Type="{x:Type local:ExampleEnum}"/>
</Windows.Resources>
<ComboBox
  ItemsSource="{StaticResource ExampleEnumItemsSource}"
  SelectedValue="{Binding ExampleProperty, Converter={StaticResource ExampleEnumItemsSource}}"/> 

23

অবজেক্টডাটাপ্রোভাইডার ব্যবহার করুন:

<ObjectDataProvider x:Key="enumValues"
   MethodName="GetValues" ObjectType="{x:Type System:Enum}">
      <ObjectDataProvider.MethodParameters>
           <x:Type TypeName="local:ExampleEnum"/>
      </ObjectDataProvider.MethodParameters>
 </ObjectDataProvider>

এবং তারপরে স্থিতিশীল সংস্থানকে আবদ্ধ করুন:

ItemsSource="{Binding Source={StaticResource enumValues}}"

এই ব্লগে এই সমাধানটি সন্ধান করুন


চমৎকার উত্তর. ঘটনাচক্রে, এটি Converterএনাম-টু-স্ট্রিং ইস্যুটির জন্য উদ্বিগ্ন হওয়া থেকে আপনাকে বাঁচায় ।
ডনবয়েট নট

1
সংযুক্ত সমাধানটি মারা গেছে (কোরিয়ান বা জাপানি পাঠ্য?)। আমি যদি আপনার কোডটি আমার এক্সএএমএল সংস্থানগুলিতে রাখি তবে এটি বলবে যে ডাব্লুপিএফ প্রকল্পে এনাম সমর্থিত নয়।
সেবাস্তিয়ান

6

এটি করার জন্য আমার প্রিয় ValueConverterউপায়টি যাতে আইটেমসোর্স এবং সিলেক্টভ্যালু উভয়ই একই সম্পত্তিতে আবদ্ধ হয়। আপনার ভিউমোডেলটিকে সুন্দর এবং পরিষ্কার রাখার জন্য এটির জন্য কোনও অতিরিক্ত বৈশিষ্ট্য প্রয়োজন ।

<ComboBox ItemsSource="{Binding Path=ExampleProperty, Converter={x:EnumToCollectionConverter}, Mode=OneTime}"
          SelectedValuePath="Value"
          DisplayMemberPath="Description"
          SelectedValue="{Binding Path=ExampleProperty}" />

এবং কনভার্টারের সংজ্ঞা:

public static class EnumHelper
{
  public static string Description(this Enum e)
  {
    return (e.GetType()
             .GetField(e.ToString())
             .GetCustomAttributes(typeof(DescriptionAttribute), false)
             .FirstOrDefault() as DescriptionAttribute)?.Description ?? e.ToString();
  }
}

[ValueConversion(typeof(Enum), typeof(IEnumerable<ValueDescription>))]
public class EnumToCollectionConverter : MarkupExtension, IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return Enum.GetValues(value.GetType())
               .Cast<Enum>()
               .Select(e => new ValueDescription() { Value = e, Description = e.Description()})
               .ToList();
  }
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
    return null;
  }
  public override object ProvideValue(IServiceProvider serviceProvider)
  {
    return this;
  }
}

এই রূপান্তরকারী যে কোনও এনামের সাথে কাজ করবে। সম্পত্তি এবং সম্পত্তি ValueDescriptionসহ কেবল একটি সাধারণ শ্রেণি । আপনি ঠিক যেমন সহজে একটি ব্যবহার করতে পারে সঙ্গে এবং অথবা, একটি সঙ্গে এবং পরিবর্তে মূল্য ও বর্ণনা বা দীর্ঘ এটি একটি enum মান এবং যে enum মূল্যের স্ট্রিং বিবরণ ধরে রাখতে পারেন হয়েছে যত আপনার পছন্দের অন্য কোন বর্গ।ValueDescriptionTupleItem1Item2KeyValuePairKeyValue


চমৎকার উত্তর! জন্য ValueDescriptionবর্গ, Descriptionসম্পত্তি প্রয়োজনে না বাদ দেওয়া যেতে পারে। একমাত্র Valueসম্পত্তি সহ একটি সাধারণ শ্রেণিও কাজ করে!
পোগোসামা

এছাড়াও, আপনি যদি কোনও রেডিওবটনকে আবদ্ধ করতে চান, তবে রূপান্তর পদ্ধতিটি অবশ্যই ক্লাসটি .Select(e => e.ToString())ব্যবহার না করে স্ট্রিংগুলির একটি তালিকা ফেরত পাঠাতে হবে ValueDescription
পোগোসামা

পরিবর্তে ValueDescriptionএকটি KeyValuePairব্যবহার করা যেতে পারে, এখানে প্রদর্শিত
Apfelkuacha

5

এখানে একটি সহায়ক পদ্ধতি ব্যবহার করে একটি জেনেরিক সমাধান রয়েছে। এটি যে কোনও অন্তর্নিহিত ধরণের (বাইট, এসবিট, ইউন্ট, লং ইত্যাদি) হ'ল পরিচালনা করতে পারে

সহায়ক পদ্ধতি:

static IEnumerable<object> GetEnum<T>() {
    var type    = typeof(T);
    var names   = Enum.GetNames(type);
    var values  = Enum.GetValues(type);
    var pairs   =
        Enumerable.Range(0, names.Length)
        .Select(i => new {
                Name    = names.GetValue(i)
            ,   Value   = values.GetValue(i) })
        .OrderBy(pair => pair.Name);
    return pairs;
}//method

মডেল দেখুন:

public IEnumerable<object> EnumSearchTypes {
    get {
        return GetEnum<SearchTypes>();
    }
}//property

কম্বো বাক্স:

<ComboBox
    SelectedValue       ="{Binding SearchType}"
    ItemsSource         ="{Binding EnumSearchTypes}"
    DisplayMemberPath   ="Name"
    SelectedValuePath   ="Value"
/>

5

আপনি এরকম কিছু বিবেচনা করতে পারেন:

  1. পাঠ্যরূপের জন্য একটি শৈলীর সংজ্ঞা দিন, বা আপনার এনাম প্রদর্শন করতে আপনি ব্যবহার করতে চান এমন অন্য কোনও নিয়ন্ত্রণ:

    <Style x:Key="enumStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="Text" Value="&lt;NULL&gt;"/>
        <Style.Triggers>
            <Trigger Property="Tag">
                <Trigger.Value>
                    <proj:YourEnum>Value1<proj:YourEnum>
                </Trigger.Value>
                <Setter Property="Text" Value="{DynamicResource yourFriendlyValue1}"/>
            </Trigger>
            <!-- add more triggers here to reflect your enum -->
        </Style.Triggers>
    </Style>
  2. কম্বোবক্স আইটেমের জন্য আপনার স্টাইলটি সংজ্ঞায়িত করুন

    <Style TargetType="{x:Type ComboBoxItem}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <TextBlock Tag="{Binding}" Style="{StaticResource enumStyle}"/>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  3. একটি কম্বোবক্স যুক্ত করুন এবং এটি আপনার এনাম মান সহ লোড করুন:

    <ComboBox SelectedValue="{Binding Path=your property goes here}" SelectedValuePath="Content">
        <ComboBox.Items>
            <ComboBoxItem>
                <proj:YourEnum>Value1</proj:YourEnum>
            </ComboBoxItem>
        </ComboBox.Items>
    </ComboBox>

যদি আপনার এনামটি বড় হয় তবে আপনি অবশ্যই অনেক কোড টাইপ করে কোডে একই কাজটি করতে পারেন। আমি সেই পদ্ধতির পছন্দ করি, যেহেতু এটি স্থানীয়করণকে সহজ করে তোলে - আপনি সমস্ত টেম্পলেট একবারে সংজ্ঞায়িত করেন এবং তারপরে আপনি কেবল আপনার স্ট্রিং রিসোর্স ফাইল আপডেট করেন।


দ্য সিলেক্টভ্যালুপ্যাথ = "সামগ্রী" আমাকে এখানে সহায়তা করেছিল। আমার কাছে আমার কম্বোবক্সআইটেমগুলি স্ট্রিংয়ের মান হিসাবে রয়েছে এবং কম্বোবক্সআইটেমকে আমার এনাম টাইপে রূপান্তর করতে পারে না। ধন্যবাদ
এডরিয়ানপ

2

আপনি যদি @ এমডিভিএমএম ব্যবহার করে থাকেন তবে @Rudigrobler উত্তরের উপর ভিত্তি করে আপনি নিম্নলিখিতটি করতে পারেন:

ভিউমোডেল ক্লাসে নিম্নলিখিত সম্পত্তি যুক্ত করুন

public Array ExampleEnumValues => Enum.GetValues(typeof(ExampleEnum));

তারপরে এক্সএএমএল-এ নিম্নলিখিত কাজগুলি করুন:

<ComboBox ItemsSource="{Binding ExampleEnumValues}" ... />

1

এটি DevExpressশীর্ষ-ভোট প্রাপ্ত উত্তরের ভিত্তিতে একটি নির্দিষ্ট উত্তর Gregor S.(বর্তমানে এটির 128 ভোট রয়েছে)।

এর অর্থ আমরা পুরো অ্যাপ্লিকেশন জুড়ে স্টাইলিংটিকে সামঞ্জস্য রাখতে পারি:

এখানে চিত্র বর্ণনা লিখুন

দুর্ভাগ্যক্রমে, আসল উত্তরটি ComboBoxEditকিছু পরিবর্তন ছাড়াই ডিভ এক্সপ্রেস এর সাথে কাজ করে না ।

প্রথম, এর জন্য এক্সএএমএল ComboBoxEdit:

<dxe:ComboBoxEdit ItemsSource="{Binding Source={xamlExtensions:XamlExtensionEnumDropdown {x:myEnum:EnumFilter}}}"
    SelectedItem="{Binding BrokerOrderBookingFilterSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    DisplayMember="Description"
    MinWidth="144" Margin="5" 
    HorizontalAlignment="Left"
    IsTextEditable="False"
    ValidateOnTextInput="False"
    AutoComplete="False"
    IncrementalFiltering="True"
    FilterCondition="Like"
    ImmediatePopup="True"/>

বলা বাহুল্য, আপনাকে নামস্পেসে নির্দেশ করতে হবে xamlExtensionsযাতে এক্সএএমএল এক্সটেনশন ক্লাস রয়েছে (যা নীচে সংজ্ঞায়িত করা হয়েছে):

xmlns:xamlExtensions="clr-namespace:XamlExtensions"

এবং আমাদের myEnumনাম স্থানটি উল্লেখ করতে হবে যাতে এনাম রয়েছে:

xmlns:myEnum="clr-namespace:MyNamespace"

তারপরে, এনাম:

namespace MyNamespace
{
    public enum EnumFilter
    {
        [Description("Free as a bird")]
        Free = 0,

        [Description("I'm Somewhat Busy")]
        SomewhatBusy = 1,

        [Description("I'm Really Busy")]
        ReallyBusy = 2
    }
}

এক্সএএমএল-এর সমস্যাটি হ'ল আমরা ব্যবহার করতে পারছি না SelectedItemValue, কারণ সেটরটি অ্যাক্সেসযোগ্য না হওয়ায় এটি একটি ত্রুটি ছুঁড়ে ফেলেছে (আপনার অংশে একটি তদারকি করার জন্য DevExpress)। সুতরাং ViewModelঅবজেক্ট থেকে সরাসরি মূল্য পেতে আমাদের আমাদের সংশোধন করতে হবে:

private EnumFilter _filterSelected = EnumFilter.All;
public object FilterSelected
{
    get
    {
        return (EnumFilter)_filterSelected;
    }
    set
    {
        var x = (XamlExtensionEnumDropdown.EnumerationMember)value;
        if (x != null)
        {
            _filterSelected = (EnumFilter)x.Value;
        }
        OnPropertyChanged("FilterSelected");
    }
}

সম্পূর্ণতার জন্য, এখানে মূল উত্তর (সামান্য নামকরণ) থেকে এক্সএএমএল এক্সটেনশন দেওয়া হয়েছে:

namespace XamlExtensions
{
    /// <summary>
    ///     Intent: XAML markup extension to add support for enums into any dropdown box, see http://bit.ly/1g70oJy. We can name the items in the
    ///     dropdown box by using the [Description] attribute on the enum values.
    /// </summary>
    public class XamlExtensionEnumDropdown : MarkupExtension
    {
        private Type _enumType;


        public XamlExtensionEnumDropdown(Type enumType)
        {
            if (enumType == null)
            {
                throw new ArgumentNullException("enumType");
            }

            EnumType = enumType;
        }

        public Type EnumType
        {
            get { return _enumType; }
            private set
            {
                if (_enumType == value)
                {
                    return;
                }

                var enumType = Nullable.GetUnderlyingType(value) ?? value;

                if (enumType.IsEnum == false)
                {
                    throw new ArgumentException("Type must be an Enum.");
                }

                _enumType = value;
            }
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var enumValues = Enum.GetValues(EnumType);

            return (
                from object enumValue in enumValues
                select new EnumerationMember
                       {
                           Value = enumValue,
                           Description = GetDescription(enumValue)
                       }).ToArray();
        }

        private string GetDescription(object enumValue)
        {
            var descriptionAttribute = EnumType
                .GetField(enumValue.ToString())
                .GetCustomAttributes(typeof (DescriptionAttribute), false)
                .FirstOrDefault() as DescriptionAttribute;


            return descriptionAttribute != null
                ? descriptionAttribute.Description
                : enumValue.ToString();
        }

        #region Nested type: EnumerationMember
        public class EnumerationMember
        {
            public string Description { get; set; }
            public object Value { get; set; }
        }
        #endregion
    }
}

দাবি অস্বীকার: ডিভ এক্সপ্রেসের সাথে আমার কোনও সম্পর্ক নেই। টেলরিকও একটি দুর্দান্ত পাঠাগার is


রেকর্ডের জন্য, আমি ডেভ এক্সপ্রেসের সাথে অনুমোদিত নই। টেলরিকের খুব সূক্ষ্ম গ্রন্থাগার রয়েছে এবং তাদের পাঠাগারটির জন্য এই কৌশলটি প্রয়োজনীয়ও নাও হতে পারে।
কনটাঙ্গো

0

ব্যবহার করার চেষ্টা করুন

<ComboBox ItemsSource="{Binding Source={StaticResource ExampleEnumValues}}"
    SelectedValue="{Binding Path=ExampleProperty}" />

এটি কাজ করে না। কম্বোবক্স কেবল একটি খালি পাঠ্য প্রদর্শন করবে এবং এটি পরিবর্তন করলে কিছুই হবে না। আমার ধারণা এখানে একটি রূপান্তরকারী নিক্ষেপ করা ভাল সমাধান হবে।
ম্যাক্সিমিলিয়ান

0

আমি একটি ওপেন সোর্স কোডপ্লেক্স প্রকল্প তৈরি করেছি যা এটি করে। আপনি এখান থেকে নুগেট প্যাকেজটি ডাউনলোড করতে পারেন ।

<enumComboBox:EnumComboBox EnumType="{x:Type demoApplication:Status}" SelectedValue="{Binding Status}" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.