RadioButtonを列挙型にバインドする方法は?


406

私はこのような列挙を持っています:

public enum MyLovelyEnum
{
    FirstSelection,
    TheOtherSelection,
    YetAnotherOne
};

DataContextにプロパティを取得しました。

public MyLovelyEnum VeryLovelyEnum { get; set; }

そして、WPFクライアントに3つのRadioButtonを取得しました。

<RadioButton Margin="3">First Selection</RadioButton>
<RadioButton Margin="3">The Other Selection</RadioButton>
<RadioButton Margin="3">Yet Another one</RadioButton>

次に、RadioButtonをプロパティにバインドして、適切な双方向バインディングを行うにはどうすればよいですか?


3
あなたのXAML内の個々のラジオボタンを指定せずにこれを行うために探している場合は、私のような列挙値にバインドされたListBoxの推薦するこのまたはこれを、それはのような使用のラジオボタンに上書き項目テンプレートあり、これを
Rachel

回答:


389

より一般的なコンバーターを使用できます

public class EnumBooleanConverter : IValueConverter
{
  #region IValueConverter Members
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    string parameterString = parameter as string;
    if (parameterString == null)
      return DependencyProperty.UnsetValue;

    if (Enum.IsDefined(value.GetType(), value) == false)
      return DependencyProperty.UnsetValue;

    object parameterValue = Enum.Parse(value.GetType(), parameterString);

    return parameterValue.Equals(value);
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    string parameterString = parameter as string;
    if (parameterString == null)
        return DependencyProperty.UnsetValue;

    return Enum.Parse(targetType, parameterString);
  }
  #endregion
}

そして、あなたが使用するXAML-Partでは:

<Grid>
    <Grid.Resources>
      <l:EnumBooleanConverter x:Key="enumBooleanConverter" />
    </Grid.Resources>
    <StackPanel >
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=FirstSelection}">first selection</RadioButton>
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=TheOtherSelection}">the other selection</RadioButton>
      <RadioButton IsChecked="{Binding Path=VeryLovelyEnum, Converter={StaticResource enumBooleanConverter}, ConverterParameter=YetAnotherOne}">yet another one</RadioButton>
    </StackPanel>
</Grid>

51
私にとっては魅力のように働きました。さらに、ConvertBackを変更して、UnsetValueを "false"で返すように変更しました。これは、silverlight(およびおそらくWPFが適切)がコンバーターを2回呼び出すためです。私はプロパティセッターから他のものをぶら下げていたので、それを一度だけ呼び出したかったのです。-if(parameterString == null || value.Equals(false))return DependencyProperty.UnsetValue;
MarcE 2010

8
私が言うことができることから、ラジオボタンが異なるグループにある場合(そして、同じ親を持つGroupNameが設定されていないAFAIKボタンは、デフォルトでは同じグループにある)でない限り、これを行う必要あります。それ以外の場合、プロパティを設定するための呼び出しは「バウンス」し、奇妙な動作になります。
nlawalker 2010年

2
はい。ただし、falseに設定するときにコンバータでUnsetを呼び出すと、trueのEnumToBooleanConverterではなく、EnumToRadioButtonConverterになります。代わりに、プロパティセッターで値が異なるかどうかを確認します。if(_myEnumBackingField == value)return;
ステファン・

8
このソリューションのバインディングは、一方向でのみ正しく機能します。バインドされたプロパティを別の値に割り当てて、ラジオボタンをプログラムで切り替えることはできませんでした。適切に機能し、より良いソリューションが必要な場合は、スコットのアプローチを使用してください。
l46kok 2012年

2
@Marc、その場合「DependencyProperty.UnsetValue」ではなく「Binding.DoNothing」を返すのは適切ではありませんか?
マークA.ドノホー2013年

560

受け入れられた回答をさらに簡略化できます。列挙型をxamlの文字列として入力し、コンバーターで必要以上の作業を行う代わりに、文字列表現の代わりに列挙型の値を明示的に渡すことができます。CrimsonXがコメントすると、ランタイムではなくコンパイル時にエラーがスローされます。

ConverterParameter = {x:Static local:YourEnumType.Enum1}

<StackPanel>
    <StackPanel.Resources>          
        <local:ComparisonConverter x:Key="ComparisonConverter" />          
    </StackPanel.Resources>
    <RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum1}}" />
    <RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum2}}" />
</StackPanel>

次に、コンバーターを単純化します。

public class ComparisonConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value?.Equals(parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value?.Equals(true) == true ? parameter : Binding.DoNothing;
    }
}

編集(12月16日'10):

DependencyProperty.UnsetValueではなくBinding.DoNothingを返すことを提案してくれたanonに感謝します。


注-同じコンテナ内のRadioButtonの複数のグループ(2011年2月17日):

xamlでは、ラジオボタンが同じ親コンテナーを共有している場合、1つを選択すると、そのコンテナー内の他のすべてが選択解除されます(別のプロパティにバインドされている場合でも)。そのため、スタックパネルのような独自のコンテナーにグループ化された共通のプロパティにバインドされているRadioButtonを保持するようにしてください。関連するRadioButtonが単一の親コンテナを共有できない場合は、各RadioButtonのGroupNameプロパティを共通の値に設定して、それらを論理的にグループ化します。


編集(2011年4月5日):

ConvertBackのif-elseを簡略化して、3項演算子を使用します。


注-クラスにネストされた列挙型(2011年4月28日):

列挙型がクラスにネストされている場合(名前空間に直接ではなく)、「+」構文を使用してXAMLの列挙型にアクセスできる場合があります。 WPFの静的参照の列挙型

ConverterParameter = {x:Static local:YourClass + YourNestedEnumType.Enum1}

ただし、このMicrosoft Connectの問題により、VS2010のデザイナーは状態をロードしなくなります"Type 'local:YourClass+YourNestedEnumType' was not found."が、プロジェクトは正常にコンパイルおよび実行されます。もちろん、列挙型を名前空間に直接移動できる場合は、この問題を回避できます。


編集(2012年1月27日):

Enumフラグを使用する場合、コンバーターは次のようになります。

public class EnumToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((Enum)value).HasFlag((Enum)parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.Equals(true) ? parameter : Binding.DoNothing;
    }
}

編集(2015年5月7日):

Nullable Enumの場合(質問では質問されませんが、ORMがDBからnullを返す場合や、プログラムロジックで値が提供されないことが理にかなっている場合など)必要になる場合があります。追加することを忘れないでください。以下のように、Convertメソッドの最初のnullチェックと適切なブール値を返します。これは通常、(ラジオボタンを選択したくない場合)falseです。

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) {
            return false; // or return parameter.Equals(YourEnumType.SomeDefaultValue);
        }
        return value.Equals(parameter);
    }

注-NullReferenceException(10月10日):

NullReferenceExceptionをスローする可能性を取り除くために例を更新しました。IsCheckednull可能な型なので、返すことNullable<Boolean>は合理的な解決策のようです。


26
私は同意します、これはより良い解決策だと思います。また、この変換を使用すると、列挙値が変更された場合に、実行時ではなくコンパイル時にプロジェクトが中断します。これは大きな利点です。
CrimsonX 10/10/20

4
これは確かに、受け入れられているソリューションよりもはるかに優れたソリューションです。+1
OrPaz

7
素晴らしい解決策。これは実際には2つの値を比較する比較コンバーターにすぎないと付け加えます。EnumToBooleanConverterよりも一般的な名前(ComparisonConverterなど)を持つことができます
MikeKulls

5
@スコット、とてもいい。このコンバーターは、Flags属性の有無にかかわらず、すべての場合に適しています。ただし、このフィルターをenumをフラグとしてコンバーターとして直接使用するのは、ほとんどの場合ばかげています。その理由は、適切な結果を得るには以前の値でブール計算(| =または^ =)を実行する必要があるが、コンバーターは以前の値にアクセスできないためです。次に、列挙値ごとにブール値を追加し、MVVMモデルで適切なブール計算を自分で行う必要があります。しかし、すべての情報に感謝します。非常に便利です。
Eric Ouellet 2012

2
Windows Phone 8(おそらくWin Storeアプリの場合)にはx:staticがないため、ここでソリューションを直接使用することはできません。ただし、IDE /コンパイラは十分に賢く、すべての文字列リテラルに対して文字列を検索します(とにかく)。たとえば、これは<RadioButton IsChecked = "{Binding TrackingMode、ConverterParameter = Driving、Converter = {StaticResource EnumToBooleanConverter}、Mode = TwoWay}" />のように機能します。駆動のタイプミスは、実行時ではなくデザイン/コンパイル時にキャッチされます。
Adarsha 2014年

26

EnumToBooleanConverterの回答の場合:DependencyProperty.UnsetValueを返す代わりに、ラジオボタンのIsChecked値がfalseになる場合はBinding.DoNothingを返すことを検討してください。前者は問題を示し(ユーザーに赤い四角形または同様の検証インジケーターを表示する可能性があります)、後者は何も実行する必要がないことを示します。これはその場合に必要なことです。

http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback.aspx http://msdn.microsoft.com/en-us/library/system.windows.data.binding .donothing.aspx


SilverlightにはBinding.Nothingはありません。WPFのみです。代わりにnullを使用してください。
Alexander Vasilyev、2015年

1
Binding.NothingもUWPからなくなっています。
BlackICE 2016

5

ListBoxでRadioButtonを使用してから、SelectedValueにバインドします。

これは、このトピックに関する古いスレッドですが、ベースの考え方は同じである必要があります。http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/


ListBoxとDataTemplateを使用して同様のメソッドを実行する双方向バインディングを取得します。
ブライアンアンダーソン、

このバグ:geekswithblogs.net/claraoscura/archive/2008/10/17/125901.aspxが1日を台無しにしました。
Slampen 2009年

3
これは断然最良のソリューションであり、他のすべては冗長なコードを引き起こします。(ListBoxのの使用
HB

3

UWPの場合、それほど単純ではありません。フィールド値をパラメーターとして渡すには、追加のフープをジャンプする必要があります。

例1

WPFとUWPの両方に有効です。

<MyControl>
    <MyControl.MyProperty>
        <Binding Converter="{StaticResource EnumToBooleanConverter}" Path="AnotherProperty">
            <Binding.ConverterParameter>
                <MyLibrary:MyEnum>Field</MyLibrary:MyEnum>
            </Binding.ConverterParameter>
        </MyControl>
    </MyControl.MyProperty>
</MyControl>

例2

WPFとUWPの両方に有効です。

...
<MyLibrary:MyEnum x:Key="MyEnumField">Field</MyLibrary:MyEnum>
...

<MyControl MyProperty="{Binding AnotherProperty, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={StaticResource MyEnumField}}"/>

例3

WPFにのみ有効です。

<MyControl MyProperty="{Binding AnotherProperty, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static MyLibrary:MyEnum.Field}}"/>

UWPはサポートしていないためx:Static例3は問題外です。例1に進むとすると、結果はより冗長なコードになります。例2は少し優れていますが、それでも理想的ではありません。

解決

public abstract class EnumToBooleanConverter<TEnum> : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var Parameter = parameter as string;

        if (Parameter == null)
            return DependencyProperty.UnsetValue;

        if (Enum.IsDefined(typeof(TEnum), value) == false)
            return DependencyProperty.UnsetValue;

        return Enum.Parse(typeof(TEnum), Parameter).Equals(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        var Parameter = parameter as string;
        return Parameter == null ? DependencyProperty.UnsetValue : Enum.Parse(typeof(TEnum), Parameter);
    }
}

次に、サポートするタイプごとに、列挙型をボックス化するコンバーターを定義します。

public class MyEnumToBooleanConverter : EnumToBooleanConverter<MyEnum>
{
    //Nothing to do!
}

ボックス化する必要があるのは、ConvertBackメソッドで型を参照する方法がないように見えるためです。ボクシングはそれを処理します。最初の2つの例のいずれかを使用する場合は、パラメーターの型を参照するだけでよく、ボックス化されたクラスから継承する必要がなくなります。すべてを1行で行い、可能な限り冗長性を抑えたい場合は、後者のソリューションが理想的です。

使用法は例2に似ていますが、実際にはそれほど冗長ではありません。

<MyControl MyProperty="{Binding AnotherProperty, Converter={StaticResource MyEnumToBooleanConverter}, ConverterParameter=Field}"/>

欠点は、サポートするタイプごとにコンバーターを定義する必要があることです。


1

RadioButtonsとCheckBoxesを列挙型にバインドするための新しいクラスを作成しました。フラグ付き列挙型(複数のチェックボックスが選択されている)と単一選択チェックボックスまたはラジオボタンのフラグなし列挙型で機能します。また、ValueConvertersもまったく必要ありません。

これは最初はもっと複雑に見えるかもしれませんが、このクラスをプロジェクトにコピーすると、完了です。それはジェネリックなので、どの列挙型でも簡単に再利用できます。

public class EnumSelection<T> : INotifyPropertyChanged where T : struct, IComparable, IFormattable, IConvertible
{
  private T value; // stored value of the Enum
  private bool isFlagged; // Enum uses flags?
  private bool canDeselect; // Can be deselected? (Radio buttons cannot deselect, checkboxes can)
  private T blankValue; // what is considered the "blank" value if it can be deselected?

  public EnumSelection(T value) : this(value, false, default(T)) { }
  public EnumSelection(T value, bool canDeselect) : this(value, canDeselect, default(T)) { }
  public EnumSelection(T value, T blankValue) : this(value, true, blankValue) { }
  public EnumSelection(T value, bool canDeselect, T blankValue)
  {
    if (!typeof(T).IsEnum) throw new ArgumentException($"{nameof(T)} must be an enum type"); // I really wish there was a way to constrain generic types to enums...
    isFlagged = typeof(T).IsDefined(typeof(FlagsAttribute), false);

    this.value = value;
    this.canDeselect = canDeselect;
    this.blankValue = blankValue;
  }

  public T Value
  {
    get { return value; }
    set 
    {
      if (this.value.Equals(value)) return;
      this.value = value;
      OnPropertyChanged();
      OnPropertyChanged("Item[]"); // Notify that the indexer property has changed
    }
  }

  [IndexerName("Item")]
  public bool this[T key]
  {
    get
    {
      int iKey = (int)(object)key;
      return isFlagged ? ((int)(object)value & iKey) == iKey : value.Equals(key);
    }
    set
    {
      if (isFlagged)
      {
        int iValue = (int)(object)this.value;
        int iKey = (int)(object)key;

        if (((iValue & iKey) == iKey) == value) return;

        if (value)
          Value = (T)(object)(iValue | iKey);
        else
          Value = (T)(object)(iValue & ~iKey);
      }
      else
      {
        if (this.value.Equals(key) == value) return;
        if (!value && !canDeselect) return;

        Value = value ? key : blankValue;
      }
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private void OnPropertyChanged([CallerMemberName] string propertyName = "")
  {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }
}

そして、それをどのように使用するかについて、タスクを手動または自動で実行するための列挙型があり、曜日にスケジュールすることができ、いくつかのオプションのオプションがあるとします...

public enum StartTask
{
  Manual,
  Automatic
}

[Flags()]
public enum DayOfWeek
{
  Sunday = 1 << 0,
  Monday = 1 << 1,
  Tuesday = 1 << 2,
  Wednesday = 1 << 3,
  Thursday = 1 << 4,
  Friday = 1 << 5,
  Saturday = 1 << 6
}

public enum AdditionalOptions
{
  None = 0,
  OptionA,
  OptionB
}

ここで、このクラスを使用するのがいかに簡単かを示します。

public class MyViewModel : ViewModelBase
{
  public MyViewModel()
  {
    StartUp = new EnumSelection<StartTask>(StartTask.Manual);
    Days = new EnumSelection<DayOfWeek>(default(DayOfWeek));
    Options = new EnumSelection<AdditionalOptions>(AdditionalOptions.None, true, AdditionalOptions.None);
  }

  public EnumSelection<StartTask> StartUp { get; private set; }
  public EnumSelection<DayOfWeek> Days { get; private set; }
  public EnumSelection<AdditionalOptions> Options { get; private set; }
}

また、チェックボックスとラジオボタンをこのクラスにバインドするのがいかに簡単かを以下に示します。

<StackPanel Orientation="Vertical">
  <StackPanel Orientation="Horizontal">
    <!-- Using RadioButtons for exactly 1 selection behavior -->
    <RadioButton IsChecked="{Binding StartUp[Manual]}">Manual</RadioButton>
    <RadioButton IsChecked="{Binding StartUp[Automatic]}">Automatic</RadioButton>
  </StackPanel>
  <StackPanel Orientation="Horizontal">
    <!-- Using CheckBoxes for 0 or Many selection behavior -->
    <CheckBox IsChecked="{Binding Days[Sunday]}">Sunday</CheckBox>
    <CheckBox IsChecked="{Binding Days[Monday]}">Monday</CheckBox>
    <CheckBox IsChecked="{Binding Days[Tuesday]}">Tuesday</CheckBox>
    <CheckBox IsChecked="{Binding Days[Wednesday]}">Wednesday</CheckBox>
    <CheckBox IsChecked="{Binding Days[Thursday]}">Thursday</CheckBox>
    <CheckBox IsChecked="{Binding Days[Friday]}">Friday</CheckBox>
    <CheckBox IsChecked="{Binding Days[Saturday]}">Saturday</CheckBox>
  </StackPanel>
  <StackPanel Orientation="Horizontal">
    <!-- Using CheckBoxes for 0 or 1 selection behavior -->
    <CheckBox IsChecked="{Binding Options[OptionA]}">Option A</CheckBox>
    <CheckBox IsChecked="{Binding Options[OptionB]}">Option B</CheckBox>
  </StackPanel>
</StackPanel>
  1. UIが読み込まれると、「手動」ラジオボタンが選択され、「手動」または「自動」の間で選択を変更できますが、どちらか一方を常に選択する必要があります。
  2. 毎日の曜日はチェックされていませんが、いくつでもチェックしたり、チェックを外したりできます。
  3. 「オプションA」と「オプションB」は、最初は両方ともオフになっています。あなたはどちらかをチェックすることができ、一方をチェックするともう一方のチェックが外れます(RadioButtonsと同様)が、両方をチェック解除することもできます(これはWPFのRadioButtonでは行えないため、ここでCheckBoxが使用されています)。

StartTask enumに{Undefined、Manual、Automatic}などの3つのアイテムがあるとします。ユーザーが値を設定するまでは未定義であるため、デフォルトでUndefinedにしたいとします。また、SelectedItemはどのように処理されますか?ViewModelにはSelectedStartTaskがありません。
user1040323

私のViewModelでは、StartUpプロパティはEnumSelection<StartTask>オブジェクトです。の定義をEnumSelection<T>見ると、Valueプロパティがあることがわかります。そのため、ビューモデルは「SelectedStartTask」を持つ必要はありません。使用しますStartUp.Value。また、Undefinedのデフォルト値については、3番目の列挙型、AdditionalOptionsを参照してください。Undefinedの代わりにNoneがありますが、その名前は自由に変更できます。
ニック

1

これはチェックボックスでも機能します。

public class EnumToBoolConverter:IValueConverter
{
    private int val;
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int intParam = (int)parameter;
        val = (int)value;

        return ((intParam & val) != 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        val ^= (int)parameter;
        return Enum.Parse(targetType, val.ToString());
    }
}

単一の列挙型を複数のチェックボックスにバインドします。


1
あなたが私にしてくれたおかげで私はあなたに大きな「感謝」を言います。それは私にとって魅力のように働いています。
Elham Azadfar 2017

0

ScottのEnumToBooleanConverterに基づいています。ConvertBackメソッドがフラグ付きEnumのコードで機能しないことに気づきました。

私は次のコードを試しました:

public class EnumHasFlagToBooleanConverter : IValueConverter
    {
        private object _obj;
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            _obj = value;
            return ((Enum)value).HasFlag((Enum)parameter);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value.Equals(true))
            {
                if (((Enum)_obj).HasFlag((Enum)parameter))
                {
                    // Do nothing
                    return Binding.DoNothing;
                }
                else
                {
                    int i = (int)_obj;
                    int ii = (int)parameter;
                    int newInt = i+ii;
                    return (NavigationProjectDates)newInt;
                }
            }
            else
            {
                if (((Enum)_obj).HasFlag((Enum)parameter))
                {
                    int i = (int)_obj;
                    int ii = (int)parameter;
                    int newInt = i-ii;
                    return (NavigationProjectDates)newInt;

                }
                else
                {
                    // do nothing
                    return Binding.DoNothing;
                }
            }
        }
    }

私は仕事に行くことができない唯一のものはからキャストを行うことですinttargetType、私はそれがハードコード作ってNavigationProjectDates、私が使用することを列挙。そして、targetType == NavigationProjectDates...


より一般的なFlags Enumコンバーターの編集:

    パブリッククラスFlagsEnumToBooleanConverter:IValueConverter {
        private int _flags = 0;
        パブリックオブジェクトConvert(オブジェクト値、タイプtargetType、オブジェクトパラメータ、文字列言語){
            if(value == null)はfalseを返します。
            _flags =(int)value;
            タイプt = value.GetType();
            オブジェクトo = Enum.ToObject(t、parameter);
            return((Enum)value).HasFlag((Enum)o);
        }

        パブリックオブジェクトConvertBack(オブジェクト値、タイプtargetType、オブジェクトパラメータ、文字列言語)
        {
            if(value?.Equals(true)?? false){
                _flags = _flags | (int)パラメータ;
            }
            そうしないと {
                _flags = _flags&〜(int)パラメータ;
            }
            _flagsを返します。
        }
    }

誰かが私の回答を編集してwith Flagsコードを追加したので、正直に言って、自分で試したり使用したりしたことがなく、自分の回答としてより理にかなっていると思うので、それを削除することを検討しました。しばらくしてから私は何かを組み合わせて、そのコードと既存のコードをテストし、問題のより良い解決策を見つける手助けをすることができます。
スコット

0

ラジオボタンを動的に作成でき、ListBoxコンバーターなしで非常に簡単に作成できます。

作成手順は次のとおりです。ListBoxを作成し、リストボックスのItemsSourceを列挙型として設定しMyLovelyEnum、ListBoxのSelectedItemをVeryLovelyEnumプロパティにバインドします。次に、各ListBoxItemのラジオボタンが作成されます。

  • ステップ1:ウィンドウ、ユーザーコントロール、グリッドなどの静的リソースに列挙型を追加します。
    <Window.Resources>
        <ObjectDataProvider MethodName="GetValues"
                            ObjectType="{x:Type system:Enum}"
                            x:Key="MyLovelyEnum">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:MyLovelyEnum" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
  • ステップ2:リストボックスを使用して、Control Templateラジオボタンとして内部の各項目を入力します
    <ListBox ItemsSource="{Binding Source={StaticResource MyLovelyEnum}}" SelectedItem="{Binding VeryLovelyEnum, Mode=TwoWay}" >
        <ListBox.Resources>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <RadioButton
                                Content="{TemplateBinding ContentPresenter.Content}"
                                IsChecked="{Binding Path=IsSelected,
                                RelativeSource={RelativeSource TemplatedParent},
                                Mode=TwoWay}" />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.Resources>
    </ListBox>

利点は以下の通りです:いつかあなたの列挙型クラスの変更は、あなたがGUI(XAMLファイル)を更新する必要がない場合。

参照: https : //brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.