DatagridColumn包含一个Combobox或Textbox,具体取决于Enum的值

时间:2013-12-05 11:04:45

标签: c# wpf combobox wpfdatagrid datatemplate

我想将特定列的单元格设置为组合框或文本框,具体取决于Datagrid的itemsource的属性。我怎样才能实现这一目标?每个rowitem都有一个ParameterType属性:

public enum ParameterType
    {
        Bool,
        Int,
        Double,
        String,
        DateTime,
        Severity
    }

如果它是Bool我想要显示一个带有true和false的Combobox,如果是int,double,string - 一个Textbox。 如果DateTime理想情况下是DateTimePicker,并且Severity是一个具有不同严重性值的Combobox。

我无法弄清楚如何更改DatagridColumn来实现这个目标....

修改

我们提出了这个想法但是指定的DataTemplateSelector似乎没有被调用 - 我已经在SelectTemplate的第一次调用中设置了一个断点,但它没有在那里启动调试。

DataTemplateSelector:

    public class InstructionsEditParameterTemplateSelector : DataTemplateSelector
{
    public DataTemplate DefaultTemplate { get; set; }
    public DataTemplate SeverityTemplate { get; set; }
    public DataTemplate IntTemplate { get; set; }
    public DataTemplate BoolTemplate { get; set; }
    public DataTemplate DateTimeTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var fpd = item as FunctionParameterDescription;
        if (fpd == null)
            return base.SelectTemplate(item, container);

        switch (fpd.ParamType)
        {
            case FunctionParameterDescription.ParameterType.Severity:
                return SeverityTemplate;

            case FunctionParameterDescription.ParameterType.Bool:
                return BoolTemplate;

            case FunctionParameterDescription.ParameterType.DateTime:
                return DateTimeTemplate;

            case FunctionParameterDescription.ParameterType.Int:
                return IntTemplate;

            default:
                return DefaultTemplate;
        }
    }

DataGridTemplateColumn:

<DataGridTemplateColumn Header="Header">
                    <DataGridTemplateColumn.CellEditingTemplateSelector>
                        <!-- not yet called... -->
                        <Configurator:InstructionsEditParameterTemplateSelector                              
                            DefaultTemplate="{StaticResource StringItemTemplate}"
                            DateTimeTemplate="{StaticResource DateItemTemplate}"
                            BoolTemplate="{StaticResource BoolItemTemplate}"
                            SeverityTemplate="{StaticResource SeverityItemTemplate}"/>
                    </DataGridTemplateColumn.CellEditingTemplateSelector>

资源:

<UserControl.Resources>
    <DataTemplate x:Key="SeverityItemTemplate">
        <ComboBox ItemsSource="{Binding ElementName=root, Path=Model.ParameterSeverityItems}"
                  DisplayMemberPath="Type" SelectedValuePath="ParamType" />
    </DataTemplate>
    <DataTemplate x:Key="StringItemTemplate">
        <TextBox Text="{Binding Value}" />
    </DataTemplate>
    <DataTemplate x:Key="DateItemTemplate">
        <DatePicker Text="{Binding Value}" />
    </DataTemplate>
    <DataTemplate x:Key="BoolItemTemplate">
        <TextBox Text="{Binding Value}" />
    </DataTemplate>
</UserControl.Resources>

好了,现在我感觉有点愚蠢...它只是没有被调用,因为DataGrid的IsReadOnly属性没有被设置为“false”......这实际上是一个例子现在你如何使它工作:d

1 个答案:

答案 0 :(得分:1)

稍微从我的评论中扩展这个想法,您可以从MSDN上的DataGridTemplateColumn Class页面(从该页面改编的代码示例)中找到DataGridTemplateColumn的帮助:

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="DataTemplate" >
            <Grid>
                <TextBox Text="{Binding}" Visibility="{StaticResource EnumToVisibilityConverter, ConverterParameter=Int}" />
                <DateTimePicker SelectedDate="{Binding}" Visibility="{StaticResource EnumToVisibilityConverter, ConverterParameter=DateTime}" />
                <ComboBox SelectedItem="{Binding}" Visibility="{StaticResource EnumToVisibilityConverter, ConverterParameter=Bool}">
                    <ComboBox.Items>
                        <ComboBoxItem>True</ComboBoxItem>
                        <ComboBoxItem>False</ComboBoxItem>
                    </ComboBox.Items>
                <ComboBox>
                ... <!--Complete this yourself-->
            </Grid>
        </DataTemplate>
    </Grid.Resources>
    <DataGrid Name="DG1" ItemsSource="{Binding}" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Some column" CellTemplate="{StaticResource DataTemplate}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

我还在网上找到了EnumToVisibilityConverter课程:

EnumToVisibilityConverter for Windows Store apps