2

私はこれを言うフラグ列挙型を持っています -

[Flags]
public enum Department
{
    None = 0,
    A = 1,
    B = 2,
    C = 4,
    D = 8
}

この列挙型の値をビューに表示したい。リストボックスを作成し、そのソースをこの enum のコレクションにバインドすることを考えましたList<Department> Departments。ビューモデルのプロパティにバインドするチェックボックスがあると考えるまで、すべてがうまく機能します-

public Department SelectedDepartments { get; set; }

ここのソリューションhttp://compilewith.net/2008/12/wpf-flagsenumvalueconverter.htmlは、列挙値をチェックボックスにバインドするためのエレガントなソリューションを提供しますが、リスト内の列挙値の数に等しいチェックボックスを作成するという1つの制限があります。しかし、私の場合、Enum には 20 個の値が含まれているため (つまり、UI に 20 個のチェックボックスがあることを意味します)、UI に非常に多くのチェックボックスを配置する余裕はありません。

使用してみましたが、メソッドMultiBindingConverterで失敗します。ConvertBackチェックボックスの状態を SelectedDepartments プロパティにバインドしたいと考えています。プロパティ値が「A | B」の場合、A と B のチェックボックスをオンにする必要がありますが、C と D はオフのままにする必要があります。

4

2 に答える 2

1

コードビハインドを使用せずにこれを行う方法はないと思います。

上記でリンクしたサンプル ソリューションを使用し、MainWindow.xaml からすべての CheckBoxes を削除し、次のメソッドを MainWindow.xaml.cs に追加して、MainWindowコンストラクターから呼び出しました。

    private void AddCheckBoxes()
    {
        var converter = new FlagsEnumValueConverter();
        foreach (Department dept in Enum.GetValues(typeof(Department)))
        {
            if (dept != Department.None)
            {
                var binding = new Binding()
                {
                    Path = new PropertyPath("Department"),
                    Converter = converter,
                    ConverterParameter = dept
                };

                var checkBox = new CheckBox() { Content = dept.ToString() };
                checkBox.SetBinding(CheckBox.IsCheckedProperty, binding);
                DepartmentsPanel.Children.Add(checkBox);
            }
        }
    }

このメソッドは、 以外の名前付き列挙型定数ごとに 1 つずつ、すべてのチェックボックスを作成する作業を行いますNone。次に、さらに部門をDepartment列挙に追加し、ソリューションを再実行して、新しく追加された部門の追加のチェックボックスを確認できます。

このソリューションを完全に機能させるには、さらにいくつかの小さな変更を加える必要がありました。コードにこれらの変更を加える必要がある場合とない場合があります。まず、DataObjectクラスを実装しINotifyPropertyChangedました。次に、MainWindow.xaml の XAML を次のように書き直しました。

<StackPanel>
    <StackPanel x:Name="DepartmentsPanel" />
    <TextBlock Margin="5,20,0,0">
        <TextBlock Text="Raw Value:" FontWeight="Bold" />
        <TextBlock Text="{Binding Department}" />
    </TextBlock>
</StackPanel>

(基本的に、既存の DepartmentsPanel を別の StackPanel にラップし、「Raw Value」表示をこの外側の StackPanel に移動しました。) 最後に、MainWindow 全体の DataContext を、 の DataContext ではなくDepartmentsPanelDataObject作成したものに設定します。この手順は、「Raw Value」表示を機能させるために必要でした。

于 2012-04-08T13:56:02.860 に答える