Za pomocą zaakceptowanej odpowiedzi utworzyłem ten konwerter, aby powiązać wiele pól wyboru z [Flags]Enum
. Uwaga: ten konwerter używa elementu klasy, więc nie używaj ponownie tej samej instancji konwertera dla wielu zestawów powiązań.
XAML:
<StackPanel>
<StackPanel.Resources>
<local:EnumFlagConverter x:Key="myConverter" />
</StackPanel.Resources>
<CheckBox Content="Option1" IsChecked="{Binding TheEnum, Converter={StaticResource myConverter}, ConverterParameter={x:Static local:MyEnum.Option1}}" />
<CheckBox Content="Option2" IsChecked="{Binding TheEnum, Converter={StaticResource myConverter}, ConverterParameter={x:Static local:MyEnum.Option2}}" />
<CheckBox Content="Option3" IsChecked="{Binding TheEnum, Converter={StaticResource myConverter}, ConverterParameter={x:Static local:MyEnum.Option3}}" />
</StackPanel>
C#:
public class EnumFlagConverter : IValueConverter
{
public Enum CurrentValue { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var theEnum = value as Enum;
CurrentValue = theEnum;
return theEnum.HasFlag(parameter as Enum);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var theEnum = parameter as Enum;
if (CurrentValue.HasFlag(theEnum))
CurrentValue = CurrentValue.And(theEnum.Not());
else
CurrentValue = CurrentValue.Or(theEnum);
return CurrentValue;
}
}
public static class Extensions
{
public static Enum Or(this Enum a, Enum b)
{
// consider adding argument validation here
if (Enum.GetUnderlyingType(a.GetType()) != typeof(ulong))
return (Enum)Enum.ToObject(a.GetType(), Convert.ToInt64(a) | Convert.ToInt64(b));
else
return (Enum)Enum.ToObject(a.GetType(), Convert.ToUInt64(a) | Convert.ToUInt64(b));
}
public static Enum And(this Enum a, Enum b)
{
// consider adding argument validation here
if (Enum.GetUnderlyingType(a.GetType()) != typeof(ulong))
return (Enum)Enum.ToObject(a.GetType(), Convert.ToInt64(a) & Convert.ToInt64(b));
else
return (Enum)Enum.ToObject(a.GetType(), Convert.ToUInt64(a) & Convert.ToUInt64(b));
}
public static Enum Not(this Enum a)
{
// consider adding argument validation here
return (Enum)Enum.ToObject(a.GetType(), ~Convert.ToInt64(a));
}
}
można określić typ jako 'int' zamiast, i mam nadzieję, że niejawna konwersja do' Enum' działa? – Matthew
Zgodziłbyś się "Ponieważ Enum jest klasą, która nie ma zdefiniowanych operacji" Myślę, że nie rozumiem zamieszania. Z tego samego powodu nie możesz zrobić ciągu foo | = "bar" –
Pomocne może być także zrozumienie, że "Enum" (System.Enum faktycznie) jest typem, podczas gdy "enum" jest słowem kluczowym używanym do deklarowania rodzaj. –