2012-04-25 68 views

回答

3

假設你要綁定到你的枚舉所有可能的值,你可以用ObjectDataProvider做到這一點。

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

這基本上代表了一個電話Enum.GetValues(typeof(TestEnum))並公開它作爲數據源: 在你的資源(Window.ResourcesApp.Resources等)聲明這一點。 注意:您需要先聲明名稱空間syslocal,其中sys是mscorlib中的System,local是您的枚舉的命名空間。

一旦你有,你可以使用ObjectDataProvider的有約束力的來源,就像別的,例如:

<ListBox ItemsSource="{Binding Source={StaticResource enumValues}}"/> 

這樣做的非聲明的方式僅僅是分配在代碼:

someListBox.ItemsSource = Enum.GetValues(typeof(TestEnum)); 

爲了結合所選的項目,可惜selectedItems屬性不能在XAML設置,但可以使用SelectionChanged事件:

<ListBox Name="lb" ItemsSource="{Binding Source={StaticResource enumValues}}" SelectionMode="Multiple" SelectionChanged="lb_SelectionChanged"></ListBox> 

,然後設置你的事件視圖模型(或任何你使用)的屬性:

private void lb_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
    viewModel.SelectedValues = lb.SelectedItems.OfType<TestEnum>().ToList(); 
} 
+0

+1我喜歡我的方式,但我確定我也喜歡你的方式! – Dummy01 2012-04-25 06:58:26

+0

謝謝,這適用於顯示列表框。 關於第二部分,將選定的值綁定到列表或類似的? – 2012-04-25 07:24:37

+0

@TomasGrosup看到我最後的編輯方式來做到這一點。 – Botz3000 2012-04-25 07:42:04

2

這個是否適合你?它將任何Enum轉換爲字典,以便您可以訪問Enum的內部整數以及其名稱(用於顯示)。

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace Sample 
{ 
    class Sample 
    { 
     public static IDictionary<String, Int32> ConvertEnumToDictionary<K>() 
     { 
      if (typeof(K).BaseType != typeof(Enum)) 
      { 
       throw new InvalidCastException(); 
      } 
      return Enum.GetValues(typeof(K)).Cast<Int32>().ToDictionary(currentItem => Enum.GetName(typeof(K), currentItem)); 
     } 
    } 
} 

編輯

您可以使用IDictionary的性質KeysValues這是類型的ICollection做你想要的綁定。

myListBox.ItemsSource = myEnumDictionary.Keys; 

或課程,你可以在XAML直接做到這一點。

+0

它適合部分,但我仍然不知道如何綁定選定的值。 – 2012-04-25 07:40:38

+0

@TomasGrosup請參閱編輯我的回答 – Dummy01 2012-04-25 08:03:06