3

チェックボックスリストをWPFの列挙値のコレクションにバインドしたいと思います。列挙型は[フラグ]ではありません。

コンテキスト:各アイテムに列挙型のインスタンスがあるデータグリッドをフィルタリングするためのものです。必ずしもリストにバインドする必要はありません。固定サイズのコレクションでも機能します。

4

4 に答える 4

5

列挙型のすべての可能な値にバインドしたいと仮定すると、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前を宣言する必要があります。ここで、 sysisclr-namespace:System;assembly=mscorliblocalis は列挙型の名前空間です。

それができたら、その 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();
}
于 2012-04-25T06:54:07.847 に答える
2

これはあなたに合っていますか?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>
于 2012-04-25T06:53:32.273 に答える