将枚举数据绑定到 WPF 中的组合框,过滤一些枚举

发布于 2024-08-30 15:27:23 字数 233 浏览 10 评论 0原文

我需要将枚举绑定到 DataGridTemplateColumn 内的组合框,但只有枚举具有的一些选项。
示例:
枚举选项: 未知全部< /b>
可绑定的:

有什么方法可以做到这一点吗?
非常感谢。

此致

I need to bind an enum to a combobox that is inside a DataGridTemplateColumn, but only some of the options that the enum has.

Example:
Enum options:
Unknow, One, Two, Three, Four, All
Bindable ones: One, Two, Three, Four

Any way to do this?
Many thanks.

Best regards

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

撩发小公举 2024-09-06 15:27:23

我有一个用于此目的的值转换器。它旨在绑定到枚举类型的属性,该属性可用于 ItemsSource 和 SelectedItem:

<ComboBox ItemsSource="{Binding Path=Day, Converter={StaticResource EnumToListConverter}, ConverterParameter='Monday;Friday'}" SelectedItem="{Binding Day}"/>

它也可以通过直接引用枚举来使用:

<ComboBox ItemsSource="{Binding Source={x:Static sys:DayOfWeek.Sunday}, Converter={StaticResource EnumToListConverter}, ConverterParameter='Monday;Friday'}" Grid.Column="2"/>

这是转换器代码:

public class EnumToListConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is Enum))
            return null;

        string filters = parameter == null ? String.Empty : parameter.ToString();
        IEnumerable enumList;
        string[] splitFilters = filters != null ? filters.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) : new string[] { };
        List<string> removalList = new List<string>(splitFilters);
        Type enumType = value.GetType();
        Array allValues = Enum.GetValues(enumType);
        try
        {
            var filteredValues = from object enumVal in allValues
                                 where !removalList.Contains(Enum.GetName(enumType, enumVal))
                                 select enumVal;
            enumList = filteredValues;
        }
        catch (ArgumentNullException)
        {
            enumList = allValues;
        }
        catch (ArgumentException)
        {
            enumList = allValues;
        }
        return enumList;

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

I have a value converter that I use for this. It's geared toward binding to a property of the enum type which would be use for both the ItemsSource and SelectedItem:

<ComboBox ItemsSource="{Binding Path=Day, Converter={StaticResource EnumToListConverter}, ConverterParameter='Monday;Friday'}" SelectedItem="{Binding Day}"/>

It can also be used by directly referencing the enum:

<ComboBox ItemsSource="{Binding Source={x:Static sys:DayOfWeek.Sunday}, Converter={StaticResource EnumToListConverter}, ConverterParameter='Monday;Friday'}" Grid.Column="2"/>

Here's the converter code:

public class EnumToListConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is Enum))
            return null;

        string filters = parameter == null ? String.Empty : parameter.ToString();
        IEnumerable enumList;
        string[] splitFilters = filters != null ? filters.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) : new string[] { };
        List<string> removalList = new List<string>(splitFilters);
        Type enumType = value.GetType();
        Array allValues = Enum.GetValues(enumType);
        try
        {
            var filteredValues = from object enumVal in allValues
                                 where !removalList.Contains(Enum.GetName(enumType, enumVal))
                                 select enumVal;
            enumList = filteredValues;
        }
        catch (ArgumentNullException)
        {
            enumList = allValues;
        }
        catch (ArgumentException)
        {
            enumList = allValues;
        }
        return enumList;

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
水中月 2024-09-06 15:27:23

复制要绑定到数组的枚举,然后绑定到该数组。

Copy the enums you wish to bind to an array and then bind to the array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文