WPF转换器枚举到数组

时间:2014-09-17 12:12:03

标签: c# wpf enums

我正在开发一个WPF项目,我需要用枚举中的值填充一个组合框。

我想通过实现这种双重转换来实现它(查看后面的代码)。我已经能够在一个方向上实现互联网示例,但我无法解决相反的问题。

我对@BenRobinson的回答澄清了我的确切目的: ComboBox绑定到枚举,并绑定到包含SelectedItem的属性,并称为OpenedResultFilter。我希望当我更改此属性值时,组合框会更新所选项目。很抱歉让我感到困惑..我对WPF不是很熟练。

你能帮助我吗?

<ComboBox 
MinWidth="80" 
ItemsSource="{Binding Converter={StaticResource EnumTypeToEnumArrayConverter}, ConverterParameter='Goldbet.GoldbetBackOffice.WPF.Model.ResultValidation.StagingOpenResultValidationFilter, Goldbet.GoldbetBackOffice.WPF.Model', Mode=OneWay}" 
SelectedItem="{Binding OpenedResultFilter, Mode=TwoWay}" 
HorizontalAlignment="Left"
Margin="1,2,1,2" 
DockPanel.Dock="Left"/>


<UserControl.Resources>
        <ResourceDictionary>

            <Converters:BoolNullableToBoolConverter x:Key="BoolNullableToBoolConverter" />
            <Converters:EnumTypeToEnumArrayConverter x:Key="EnumTypeToEnumArrayConverter"/>



public class StagingResultsBatchImportViewModel : WorkspaceViewModel, IHierarchyViewModel
    {
private StagingOpenResultValidationFilter _openedResultFilter = StagingOpenResultValidationFilter.Tutti;
        public StagingOpenResultValidationFilter OpenedResultFilter
        {
            get { return _openedResultFilter; }
            set
            {
                if (_openedResultFilter != value)
                {
                    _openedResultFilter = value;
                    OnPropertyChanged("OpenedResultFilter");
                }
            }
        }
}


public class EnumTypeToEnumArrayConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Type enumType = Type.GetType((string)parameter);
        return Enum.GetValues(enumType).Cast<int>().Select(p => Enum.ToObject(enumType, p));
    }

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

    #endregion
}

2 个答案:

答案 0 :(得分:1)

如果您没有使用MVVM,因为我怀疑您可以执行此类操作,它会在XAML中名为enumCombo的ComboBox中显示所有Enum值:

public enum myEnum
{
    One,
    Two,
    Four,
    Eight
}

public partial class MainWindow : Window
{
    private IEnumerable<string> _enumValues;
    public MainWindow()
    {
        InitializeComponent();

        _enumValues = ConvertEnumToStrings<myEnum>();

        enumCombo.ItemsSource = _enumValues;
    }

    private static IEnumerable<string> ConvertEnumToStrings<T>()
    {
        var enumValues = Enum.GetValues(typeof(T))
            .Cast<T>()
            .Select(x => x.ToString())
            .OrderBy(x => x)
            .ToArray();

        return enumValues;
    }
}

如果您正在进行MVVM,这个枚举转换将在ViewModel中完成,并作为字符串集合(如上所述)或封装(枚举值)的ViewModel以及枚举值的友好名称(即名称)公开-value对,具有用户界面友好的能力。

答案 1 :(得分:0)

对不起,伙计们,我打开这个问题弄得很乱。

实际问题完全不同,因此,如果问题对社区没有任何价值,请随意投票以关闭或删除它。