허용 된 대답을 사용하여이 변환기를 사용하여 여러 개의 확인란을 [Flags]Enum
에 바인딩했습니다. 참고 :이 변환기는 클래스 멤버를 사용하므로 여러 바인딩 집합에 대해 동일한 변환기 인스턴스를 다시 사용하지 마십시오.
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));
}
}
당신이 같은 유형을 지정할 수'int' 대신에, 그리고에 암시 적 변환 'Enum' 작동 희망? – Matthew
"Enum은 정의 된 작업이없는 클래스이므로"나는 혼란을 이해하는 데 어려움을 겪고 있다고 생각합니다. 그것은 문자열 foo | = "bar"를 사용할 수없는 것과 같은 이유입니다 –
"Enum"(실제로는 System.Enum)이 유형이고 "enum"은 유형을 선언하는 데 사용되는 키워드라는 것을 이해하는 것이 도움이 될 수 있습니다 유형. –