チェックボックスリストをWPFの列挙値のコレクションにバインドしたいと思います。列挙型は[フラグ]ではありません。
コンテキスト:各アイテムに列挙型のインスタンスがあるデータグリッドをフィルタリングするためのものです。必ずしもリストにバインドする必要はありません。固定サイズのコレクションでも機能します。
チェックボックスリストをWPFの列挙値のコレクションにバインドしたいと思います。列挙型は[フラグ]ではありません。
コンテキスト:各アイテムに列挙型のインスタンスがあるデータグリッドをフィルタリングするためのものです。必ずしもリストにバインドする必要はありません。固定サイズのコレクションでも機能します。
列挙型のすべての可能な値にバインドしたいと仮定すると、ObjectDataProviderでそれを行うことができます。Window.Resources
これをリソース (またはApp.Resources
その他) で宣言します。
<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))
それをデータ ソースとして公開します。sys
注: 名前空間とlocal
前を宣言する必要があります。ここで、 sys
isclr-namespace:System;assembly=mscorlib
とlocal
is は列挙型の名前空間です。
それができたら、その ObjectDataProvider を他のものと同じようにバインディング ソースとして使用できます。次に例を示します。
<ListBox ItemsSource="{Binding Source={StaticResource enumValues}}"/>
これを行う非宣言的な方法は、コードでそれを割り当てるだけです:
someListBox.ItemsSource = Enum.GetValues(typeof(TestEnum));
選択した項目をバインドする場合、残念ながら Xaml から SelectedItems プロパティを設定することはできませんが、SelectionChanged イベントを使用できます。
<ListBox Name="lb" ItemsSource="{Binding Source={StaticResource enumValues}}" SelectionMode="Multiple" SelectionChanged="lb_SelectionChanged"></ListBox>
次に、イベントで ViewModel (または使用するもの) にプロパティを設定します。
private void lb_SelectionChanged(object sender, SelectionChangedEventArgs e) {
viewModel.SelectedValues = lb.SelectedItems.OfType<TestEnum>().ToList();
}
これはあなたに合っていますか?Enum を Dictionary に変換するため、Enum の内部 int とその名前 (表示用) にアクセスできます。
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));
}
}
}
編集:
ICollection 型の IDictionary プロパティを使用して、必要なバインドを行うことができKeys
ます。Values
myListBox.ItemsSource = myEnumDictionary.Keys;
もちろん、XAML で直接行うこともできます。
<ListBox ItemsSource="{Binding myEnumDictionary.Keys}"></ListBox>