我想將複選框列表綁定到WPF中的枚舉值集合。 枚舉不是[標誌]。WPF綁定到複選框列表的枚舉列表(或類似)
上下文: 它用於過濾一個數據網格,其中每個項目都有一個我的枚舉實例。 它不一定需要綁定到列表,固定大小的集合也可以。
我想將複選框列表綁定到WPF中的枚舉值集合。 枚舉不是[標誌]。WPF綁定到複選框列表的枚舉列表(或類似)
上下文: 它用於過濾一個數據網格,其中每個項目都有一個我的枚舉實例。 它不一定需要綁定到列表,固定大小的集合也可以。
假設你要綁定到你的枚舉所有可能的值,你可以用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.Resources
或App.Resources
等)聲明這一點。 注意:您需要先聲明名稱空間sys
和local
,其中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();
}
這個是否適合你?它將任何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的性質Keys
和Values
這是類型的ICollection做你想要的綁定。
myListBox.ItemsSource = myEnumDictionary.Keys;
或課程,你可以在XAML直接做到這一點。
它適合部分,但我仍然不知道如何綁定選定的值。 – 2012-04-25 07:40:38
@TomasGrosup請參閱編輯我的回答 – Dummy01 2012-04-25 08:03:06
+1我喜歡我的方式,但我確定我也喜歡你的方式! – Dummy01 2012-04-25 06:58:26
謝謝,這適用於顯示列表框。 關於第二部分,將選定的值綁定到列表或類似的? –
2012-04-25 07:24:37
@TomasGrosup看到我最後的編輯方式來做到這一點。 – Botz3000 2012-04-25 07:42:04