使用类型填充组合框

Populate combox with a type

我正在开发一个新应用程序,它使用大量反射并且在填充组合框时遇到一些问题。

我有一个参数 class,其中包含有关特定方法参数的一些信息:

   class Parameter
    {
        public string Name { get; set; }

        public Type Type { get; set; }

        public object Value { get; set; }
    }

我还有一个带有 DataTemplateSelector 的视图,它根据参数类型选择不同的 DataTemplated:

class ParameterDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate StringDataTemplate { get; set; }
    public DataTemplate BoolDataTemplate { get; set; }
    public DataTemplate EnumDataTemplate { get; set; }
    public DataTemplate NullTypeDataTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var parameter = item as Parameter;
        if (parameter.Type == null)
        {
            return NullTypeDataTemplate;
        }
        if (parameter.Type == typeof (int)
            || parameter.Type == typeof(string))
        {
            return StringDataTemplate;
        }
        if (parameter.Type.BaseType == typeof (Enum))
        {
            return EnumDataTemplate;
        }
        return BoolDataTemplate;      
    }
}

在我的 XAML 中,我有不同的模板:

<UserControl x:Class="Stuff.UI.Views.ParametersView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:dataTemplateSelectors="clr-namespace:Stuff.UI.Common.DataTemplateSelectors"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">

    <UserControl.Resources>
        <DataTemplate x:Key="StringDataTemplate">
            <StackPanel>
                <Label Content="{Binding Name}"/>
                <TextBox Text="{Binding Value}" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="BoolDataTemplate">
            <StackPanel>
                <CheckBox Content="{Binding Name}" IsChecked="{Binding Value}"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="EnumDataTemplate">
            <StackPanel>
                <ComboBox ItemsSource="{Binding >>something<<}"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="NullDataTemplate">
            <StackPanel>
                <Label Content="NULL TYPE"/>
            </StackPanel>
        </DataTemplate>

        <dataTemplateSelectors:ParameterDataTemplateSelector
            StringDataTemplate="{StaticResource StringDataTemplate}"
            BoolDataTemplate="{StaticResource BoolDataTemplate}"
            EnumDataTemplate="{StaticResource EnumDataTemplate}"
            NullTypeDataTemplate="{StaticResource NullDataTemplate}"
            x:Key="ParameterDataTemplateSelector"/>

    </UserControl.Resources>
    <Grid x:Name="MainGrid">
        <StackPanel Background="#dddddd">
            <Label Content="Parameters" Background="#e1db45"></Label>
            <ScrollViewer VerticalScrollBarVisibility="Auto" Height="Auto" Margin="10">
                <ItemsControl ItemsSource="{Binding Parameters}" ItemTemplateSelector="{StaticResource ParameterDataTemplateSelector}">
            </ItemsControl>
            </ScrollViewer>
        </StackPanel>
    </Grid>
</UserControl>

所以问题出在我的组合框上:

        <DataTemplate x:Key="EnumDataTemplate">
            <StackPanel>
                <ComboBox ItemsSource="{Binding >>something<<}"/>
            </StackPanel>
        </DataTemplate>

当我只有一个类型(并且我通过检查它是一个枚举类型知道)时如何填充它?或者我应该以某种方式在代码隐藏中做到这一点?我在这里有点迷路,一般来说对 MVVM 和 WPF 还很陌生。

试着看看这个: Bind to an enumeration


您应该使用 ObjectDataProvider。

您可以使用转换器从枚举类型中获取枚举值列表。像这样:

<ComboBox ItemsSource="{Binding Type,Converter={StaticResource EnumToValuesConverter}}">
    <ComboBox.Resources>
        <ResourceDictionary>
            <local:EnumToValuesConverter x:Key="EnumToValuesConverter" />
        </ResourceDictionary>
    </ComboBox.Resources>
</ComboBox>

转换器应该只对枚举类型调用 "GetEnumValues"

public class EnumToValuesConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var enumType = (Type)value;
        return enumType.GetEnumValues();
    }

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