Можно решить задачу создав свой 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>