1

可能な構成を表す列挙型があります。(以下はほんの一例です...)

public enum ConfigurationType {
    [Description("Minimal Configuration")]
    Minimal = 0,
    [Description("Standard Configuration")]
    Standard,
    [Description("Premium Configuration")]
    Premium
}

現在、クラスのタイプのプロパティを値コンバーター (ここConfigurationTypeにあります) を使用して ComboBox にバインドし、説明を表示しています。それはうまくいきます。しかし、私がやりたいことは、その場で特定の列挙型メンバーの選択を無効にできることです。その結果、それらは ComboBox に表示されません。

この列挙型をフラグ列挙型に変換してから、一連のフラグにバインドしようとしましたが、あまりうまくいきませんでした。それまたは他の提案に関する指針はありますか?

編集 - フラグの例

フラグを使用しようとすると、列挙型を次のように変更しました。

[Flags]
public enum ConfigurationType {
    [Description("Minimal Configuration")]
    Minimal = 1 << 0,
    [Description("Standard Configuration")]
    Standard = 1 << 1,
    [Description("Premium Configuration")]
    Premium = 1 << 2
}

public ConfigurationType AvailableConfigs = ConfigurationType.Standard | ConfigurationType.Premium;

実際には、これらのビットごとの or のリストを AvailableConfigs などの変数に割り当てることができるように機能しますが (上記のように)、値コンバーターの部分がハングアップしました。値コンバーターを実装して、AvailableConfigs に存在する各フラグの説明を取得し、SelectedConfiguration などの (同じく ConfigurationType の) 変数に変換する方法がわかりませんでした。もちろん、SelectedConfiguration のセッターは、一度に存在するフラグを 1 つだけ強制します。

4

1 に答える 1

1

XAML で利用可能なオプションを定義できる場合は、次のようにすることができます。

EnumValuesConverter.cs で

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value == null)
        return null;
    else
    {
        if (string.IsNullOrEmpty((string)parameter))
        {
            return EnumValueCache.GetValues(value.GetType());
        }
        return EnumValueCache.GetValues(value.GetType()).Where(x => parameter.ToString().Contains(x.ToString()));
    }
}

そして、次のように使用される ConverterParameter でバインドします。

<ComboBox Height="23" HorizontalAlignment="Left" Margin="25,27,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" 
          ItemsSource="{Binding MyEnumProperty, Converter={StaticResource enumConverter}, ConverterParameter=Minimal-Standard}"
          SelectedItem="{Binding MyEnumProperty, Mode=TwoWay}"/>

これは、ConverterParameter を単純な文字列フィルターとして使用してMinimal、オプションのみを表示します。Standard

もっと動的なものが必要な場合は、そう言ってください。残念ながら ConverterParameters をバインドできないため、さらに作業が必要になります。

動的プロパティ ソリューション

プロパティを使用して同じことを行うにはAvailableConfigs、MultiBinding ソリューションを実装する必要があります (これにより、複数のプロパティにバインドできます)。

バインディングの順序は、コンバーターに渡される順序になるため重要です。

例えば

<ComboBox Height="23" HorizontalAlignment="Left" Margin="25,27,0,0" Name="comboBox2" VerticalAlignment="Top" Width="120" >
    <ComboBox.ItemsSource>
        <MultiBinding Converter="{StaticResource enumConverter}">
            <Binding Path="MyEnumProperty" />
            <Binding Path="AvailableConfigs" />
        </MultiBinding>
    </ComboBox.ItemsSource>
</ComboBox>

MultiBinding は WPF の一部であり、Silverlight の一部ではないため、いくつかの Silverlight MultiBinding ソリューションを次に示します。

于 2012-08-01T14:12:51.830 に答える