Sử dụng câu trả lời được chấp nhận, tôi đã tạo công cụ chuyển đổi này để liên kết nhiều hộp kiểm với số [Flags]Enum
. Lưu ý: công cụ chuyển đổi này sử dụng một thành viên nhóm, do đó, không sử dụng lại cùng một cá thể chuyển đổi cho nhiều bộ ràng buộc.
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));
}
}
bạn có thể xác định loại là 'int' thay vào đó, và hy vọng rằng chuyển đổi ngầm cho' Enum' hoạt động? – Matthew
Bạn có chấp nhận "Vì Enum là một lớp không có các hoạt động đó được định nghĩa" Tôi đoán tôi đang gặp khó khăn khi hiểu nhầm lẫn. Đó cũng là lý do bạn không thể thực hiện chuỗi foo | = "bar" –
Cũng có thể hữu ích khi hiểu rằng "Enum" (System.Enum thực sự) là một loại, trong khi "enum" là từ khóa được sử dụng để khai báo kiểu. –