WPF:如何在Xaml中使用枚举填充组合框

WPF:如何在Xaml中使用枚举填充组合框,wpf,enums,combobox,Wpf,Enums,Combobox,我知道有几种方法可以做到这一点,但如果可能的话,我想让它变得更容易,因为我有很多组合框可以用这种方式绑定。建议使用ObjectDataProvider。问题是我必须为每个枚举创建一个资源条目,这太多了。到目前为止,我一直在使用代码隐藏方式,因为它要短得多: cmb.ItemsSource = Enum.GetValues(typeof(MyTypes)); 我想知道是否可以用Xaml生成一个等价物。我想我们可以用转换器来存档。我们可以将类型转换为数组,然后将数组绑定到combobox的Item

我知道有几种方法可以做到这一点,但如果可能的话,我想让它变得更容易,因为我有很多组合框可以用这种方式绑定。建议使用ObjectDataProvider。问题是我必须为每个枚举创建一个资源条目,这太多了。到目前为止,我一直在使用代码隐藏方式,因为它要短得多:

cmb.ItemsSource = Enum.GetValues(typeof(MyTypes));
我想知道是否可以用Xaml生成一个等价物。我想我们可以用转换器来存档。我们可以将类型转换为数组,然后将数组绑定到combobox的ItemsSource。但是我被困在如何为转换器指定枚举的问题上。这是我的密码:

我的枚举:

public enum MyTypes { Type1, Type2, Type3 }; 
这是我的转换器:

public class EnumToArrayConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Enum.GetValues(value.GetType());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null; // I don't care about this
    }
}
我的Xaml资源:

<lib:EnumToArrayConverter x:Key="E2A"/>
以下是如何使用它:

<ComboBox SelectedItem="{Binding MyType}" ItemsSource="{Binding MyTypes, Converter={StaticResource E2A}}"/>

因此,我的问题是如何向转换器指定我的enum MyTypes。我还尝试预先设置名称空间,但没有任何帮助。

您最好使用一个,like。

您最好使用一个,like。

Code裸体发布一个很好的方法

对于您的工作方法,您可以将转换器更改为Enum.GetValuesvalue作为类型,并使用x:Type语法作为绑定的源

ItemsSource="{Binding Source={x:Type local:MyValues},
                      Converter={StaticResource EnumToArrayConverter}}"
枚举阵列转换器


Code裸体贴是一个很好的方法

对于您的工作方法,您可以将转换器更改为Enum.GetValuesvalue作为类型,并使用x:Type语法作为绑定的源

ItemsSource="{Binding Source={x:Type local:MyValues},
                      Converter={StaticResource EnumToArrayConverter}}"
枚举阵列转换器


非常感谢你的提示。它工作得很好!只是好奇:为什么我不能将{x:typemytypes}传递给转换器?或者这样做的正确语法是什么?事实上,你可以:-读一下Meleak的帖子,但在WPF中这并不是最好的方法。你是对的。因此,MarkupExtension更强大。说MarkupExtension可以取代IValueConverter是对的吗?不,一点也不。IValueConverter用于在值通过绑定时进行转换。MarkupExtension允许您使用XAML提供值。例如,如果将属性绑定到文本属性,则可以使用IValueConverter将字符串设为大写。向下投票,因为链接的文章实际上不起作用-它不完整,并且没有显示完整的实现代码集。此外,在VS2015中实现它会导致语法错误,指出ItemsSource绑定中的第一个打开的大括号是意外的-该代码可能不再适用于较新的MarkupExpression语法。建议在这里发布当代VS.的工作解决方案。非常感谢您的提示。它工作得很好!只是好奇:为什么我不能将{x:typemytypes}传递给转换器?或者这样做的正确语法是什么?事实上,你可以:-读一下Meleak的帖子,但在WPF中这并不是最好的方法。你是对的。因此,MarkupExtension更强大。说MarkupExtension可以取代IValueConverter是对的吗?不,一点也不。IValueConverter用于在值通过绑定时进行转换。MarkupExtension允许您使用XAML提供值。例如,如果将属性绑定到文本属性,则可以使用IValueConverter将字符串设为大写。向下投票,因为链接的文章实际上不起作用-它不完整,并且没有显示完整的实现代码集。此外,在VS2015中实现它会导致语法错误,指出ItemsSource绑定中的第一个打开的大括号是意外的-该代码可能不再适用于较新的MarkupExpression语法。建议在这里发布当代VS。