[C#] WPF數據綁定:如何使用XAML將枚舉數據綁定到組合框?


Answers

我一直這樣做的方式如下。 這個解決方案的優點在於它完全通用,可以重複用於任何枚舉類型。

1)定義枚舉時,請使用一些自定義屬性來提供一些信息。 在這個例子中,我使用了Browsable(false)來表示這個枚舉器是內部的,我不想在組合框中看到這個選項。 描述(“”)允許我指定枚舉的顯示名稱。

public enum MyEnumerationTypeEnum
  {
    [Browsable(false)]
    Undefined,
    [Description("Item 1")]
    Item1,
    [Description("Item 2")]
    Item2,
    Item3
  }

2)定義一個我稱之為EnumerationManager的類。 這是一個分析Enumeration類型並生成值列表的泛型類。 如果枚舉器將Browsable設置為false,則將跳過它。 如果它具有Description屬性,那麼它將使用描述字符串作為顯示名稱。 如果沒有找到描述,它將只顯示枚舉器的默認字符串。

public class EnumerationManager
  {
    public static Array GetValues(Type enumeration)
    {
      Array wArray = Enum.GetValues(enumeration);
      ArrayList wFinalArray = new ArrayList();
      foreach(Enum wValue in wArray)
      {
        FieldInfo fi = enumeration.GetField(wValue.ToString());
        if(null != fi)
        {
          BrowsableAttribute[] wBrowsableAttributes = fi.GetCustomAttributes(typeof(BrowsableAttribute),true) as BrowsableAttribute[];
          if(wBrowsableAttributes.Length > 0)
          {
            //  If the Browsable attribute is false
            if(wBrowsableAttributes[0].Browsable == false)
            {
              // Do not add the enumeration to the list.
              continue;
            }        
          }

          DescriptionAttribute[] wDescriptions = fi.GetCustomAttributes(typeof(DescriptionAttribute),true) as DescriptionAttribute[];
      if(wDescriptions.Length > 0)
      {
        wFinalArray.Add(wDescriptions[0].Description);
      }
      else 
        wFinalArray.Add(wValue);
        }
      }

      return wFinalArray.ToArray();
    }
  }

3)在您的xaml中添加ResourceDictionary中的一個部分

  <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type l:EnumerationManager}" x:Key="OutputListForMyComboBox">
      <ObjectDataProvider.MethodParameters>
           <x:Type TypeName="l:MyEnumerationTypeEnum" />
      </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>

4)現在只需將組合框的ItemsSource綁定到我們剛剛在資源字典中定義的這個鍵

<ComboBox Name="comboBox2" 
          ItemsSource="{Binding Source={StaticResource OutputListForMyComboBox}}" />

如果您使用上面的枚舉嘗試此代碼,您應該在組合框中看到3個項目:

Item 1
Item 2
Item3

希望這可以幫助。

編輯:如果您添加LocalizableDescriptionAttribute的實現,並使用它而不是我正在使用的Description屬性將是完美的。

Question

這個問題在這裡已有答案:

我上課了:

public class AccountDetail
{
    public DetailScope Scope
    {
        get { return scope; }
        set { scope = value; }
    }

    public string Value
    {
        get { return this.value; }
        set { this.value = value; }
    }

    private DetailScope scope;
    private string value;

    public AccountDetail(DetailScope scope, string value)
    {
        this.scope = scope;
        this.value = value;
    }
}

和一個枚舉:

public enum DetailScope
{
    Private, 
    Business, 
    OtherDetail
}

最後,我有一個.xaml文件:

<Window x:Class="Gui.Wpf.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" 
    SizeToContent="WidthAndHeight">

    <Grid>
        <ComboBox 
            Name="ScopeComboBox" 
            Width="120" 
            Height="23" 
            Margin="12" />
    </Grid>
</Window>

我想做兩件事:

  1. 我希望數據將DetailsScope枚舉值綁定到組合框值。 我不希望直接綁定枚舉值,因為最後一個枚舉值是OtherDetail而不是Other detail (添加了空格字符和小寫字母'd')。
  2. 我希望將組合框中的選定值綁定到AccountDetail對象實例中指定的值。

你能救我嗎? 謝謝。

更新:我發現這篇文章http://blogs.msdn.com/b/wpfsdk/archive/2007/02/22/displaying-enum-values-using-data-binding.aspx 。 我需要類似的東西。




我會使用一個值轉換器,這將允許您使用轉換器直接綁定,您可以更改轉換實現,以便為枚舉的“更好”的人類可讀表示,即拆分大寫字符。

這裡有一篇關於這種方法的完整文章。

  public class MyEnumToStringConverter : IValueConverter
  {
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     {
         return value.ToString();
     }

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     {
         return (MyEnum) Enum.Parse( typeof ( MyEnum ), value.ToString(), true );
     }
  }




Links