@iRumba

Как привязаться (binding) к перечислению (enum), исключив ненужные элементы?

Здравствуйте. Есть много помощи по биндингу, но я не нашел условий привязки. Как можно исключить из списка ненужный элемент?

Ну например есть тип Enum : int
None = 0,
Nuber1 = 1,
number2 = 2

Скажите, как мне вывести все это в xaml'е в ComboBox, например, исключив значение None?
  • Вопрос задан
  • 1097 просмотров
Решения вопроса 3
@carbon88
.NET developer/ORM developer
думаю можно сформировать нужный список значений и прибиндить уже его.

1)Enum.GetValues(typeof (T)) - получите все значения из Enum.
2)Enum.GetValues(typeof (T)).Cast() - получите IEnumerable
3 ) тут с помощью, например, Where() отфильтруйте ненужные значения
4) сформируйте List с помощью ToList()

и его и используйте в ComboBox
Ответ написан
Комментировать
Ответ от Алексей Кулаков @carbon8 подходящий.
Подобное гуглится при запросе "C# wpf bind enum with filter".
Ответ написан
Комментировать
@BlackGad
.NET разработчик
Можно решить задачу создав свой ValueConverter, где как говорилось, выше фильтруем ненужные значения. Здесь же можно перепаковать при необходимости значение в свой расширенный тип (например из значения перечисления вытягивать атрибут Display и показывать имя, сортировать по порядку)

Сам конвертер

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace WpfApplication1
{
    [ContentProperty("ExcludeValues")]
    class EnumValueSource : DependencyObject, IValueConverter
    {
        public static readonly DependencyProperty ExcludeValuesProperty =
            DependencyProperty.Register("ExcludeValues", typeof(ObservableCollection<object>), typeof(EnumValueSource), new PropertyMetadata(null, null, OnCoerceValue));

        private static object OnCoerceValue(DependencyObject d, object baseValue)
        {
            return baseValue ?? new ObservableCollection<object>();
        }

        public EnumValueSource()
        {
            CoerceValue(ExcludeValuesProperty);
        }

        public ObservableCollection<object> ExcludeValues
        {
            get { return (ObservableCollection<object>)GetValue(ExcludeValuesProperty); }
            set { SetValue(ExcludeValuesProperty, value); }
        }

        object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var enumType = value as Type;
            if(enumType != null && enumType.IsEnum)
            {
                return Enum.GetValues(enumType).OfType<object>().Except(ExcludeValues);
            }

            return Enumerable.Empty<object>();
        }

        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}


Использование в WPF

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        
        <local:EnumValueSource x:Key="VerticalAlignmentEnumSource">
            <VerticalAlignment>Center</VerticalAlignment>
            <VerticalAlignment>Top</VerticalAlignment>
        </local:EnumValueSource>
        
    </Window.Resources>
    
    <Grid VerticalAlignment="Center" HorizontalAlignment="Center">
        <ComboBox ItemsSource="{Binding Source={x:Type VerticalAlignment}, Converter={StaticResource VerticalAlignmentEnumSource}}">
            <ComboBox.SelectedItem>
                <VerticalAlignment>Bottom</VerticalAlignment>
            </ComboBox.SelectedItem>
        </ComboBox>
    </Grid>
</Window>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы