c# - 使用类型填充组合框

标签 c# wpf data-binding combobox

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

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

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

        public Type Type { get; set; }

        public object Value { get; set; }
    }

我还有一个带有 DataTemplateSelector 的 View ,它根据参数类型选择不同的 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 还很陌生。

最佳答案

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

<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();
    }
}

关于c# - 使用类型填充组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27749628/

相关文章:

c# - ParallelEnumerable.Aggregate 用于多种方法

c# - 从 OnClientClick 将 eventArgs 从 ASP.NET C# 传递到 javascript

c# - 在 C# 安装项目中完成设置后如何自动启动我的应用程序

c# - 选择 child 后触发 WPF TreeviewItem 父选择事件?

wpf - 防止控件迫使 parent 调整大小

c# - ASP.net 以编程方式将数据集绑定(bind)到 gridview

c# - 如何在我的场景中使用 MVVM 动态更新数据网格

c# - TFS 文件更改通知

javascript - Angularjs 两种方式绑定(bind)

c# - 调整父窗口大小时的 WPF 调整大小/对齐按钮