如何将Datagrid Combobox单元格更改为文本框?

时间:2011-02-04 21:53:50

标签: c# wpf wpf-controls

我需要将第1行的第1个单元格更改为空白文本框。 现在我将列作为datagridviewcombobox列?                     

                    <DataGridComboBoxColumn Header="And/Or" Width="60" ItemsSource="{Binding Source={StaticResource PredicateCombinationOperatorsEnumValues}}" SelectedItemBinding="{Binding PredicateCombinationOperator, Mode=TwoWay}" />
                    <DataGridComboBoxColumn Header="Field" ItemsSource="{Binding Source={StaticResource FieldTypeEnumValues}}" SelectedItemBinding="{Binding FieldType}"/>
                    <DataGridComboBoxColumn Header="Operator" MinWidth="70" ItemsSource="{Binding Source={StaticResource OperatorsEnumValues}}" SelectedItemBinding="{Binding Operator}"/>
                    <DataGridTextColumn Header="Value" MinWidth="100" Width="*"  Binding="{Binding Expression}"/>
                </DataGrid.Columns>
                <DataGrid.InputBindings>
                    <KeyBinding Command="{Binding Source={StaticResource DeleteContextMenuCommand}}" Key="Delete"/>
                </DataGrid.InputBindings>
                <DataGrid.ContextMenu>
                    <ContextMenu ItemsSource="{Binding MenuOptions}">
                        <ContextMenu.ItemContainerStyle>
                            <Style TargetType="{x:Type MenuItem}">
                                <Setter Property="Header" Value="{Binding Name}" />
                                <Setter Property="Command" Value="{Binding}" />
                                <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource BoolToVisibilityConverter}}" />
                                <Setter Property="AutomationProperties.AutomationId" Value="{Binding Name}" />
                                <Setter Property="AutomationProperties.Name" Value="{Binding Name}" />
                            </Style>
                        </ContextMenu.ItemContainerStyle>
                    </ContextMenu>
                </DataGrid.ContextMenu>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="ContextMenuOpening">
                        <trigger:ContextMenuOpeningTriggerAction/>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="SelectionChanged">
                        <trigger:SelectionChangeTriggerAction/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </DataGrid>

1 个答案:

答案 0 :(得分:1)

您可以指定条件数据模板,并根据您的条件选择模板。首先,我们必须从DataTemplateSelector继承类并定义DataTemplate类型的属性。定义与所需数据模板一样多的属性。然后重写SelectTemplate方法以返回所需的datatemplate。检查以下示例代码

  <Window.Resources>
    <local:Animals x:Key="animals"/>
    <DataTemplate x:Key="TextTemplate">
        <TextBox Margin="2" Width="60" />
    </DataTemplate>
    <DataTemplate x:Key="ComboTemplate" >
        <ComboBox Width="60" />
    </DataTemplate>
</Window.Resources>
<Grid>
    <Controls:DataGrid>
        <Controls:DataGrid.Columns>
            <Controls:DataGridTemplateColumn Header="And/Or" Width="60">
                <Controls:DataGridTemplateColumn.CellTemplateSelector>
                    <local:CustomTemplateSelector
        TextTemplate="{StaticResource TextTemplate}"
        ComboTemplate="{StaticResource ComboTemplate}"/>
                </Controls:DataGridTemplateColumn.CellTemplateSelector>
            </Controls:DataGridTemplateColumn>

            <Controls:DataGridComboBoxColumn Header="Field"/>
            <Controls:DataGridComboBoxColumn Header="Operator" MinWidth="70" />
            <Controls:DataGridTextColumn Header="Value" MinWidth="100" Width="*"/>
        </Controls:DataGrid.Columns>

    </Controls:DataGrid>

</Grid>



    public class CustomTemplateSelector : DataTemplateSelector
{
  public DataTemplate TextTemplate
  { get; set; }

  public DataTemplate ComboTemplate
  { get; set; }

  public override DataTemplate SelectTemplate(object item, DependencyObject container)
  {
     MyObject obj = item as MyObject;

    if (obj != null)
    {
            // custom logic to select appropriate data template and return
    }
    else
      return base.SelectTemplate(item, container);
  }


  }
}

了解更多信息

http://zamjad.wordpress.com/2010/08/23/apply-conditional-data-template-in-data-grid/