C# 如何将Datagridcombobox单元格更改为textbox?

C# 如何将Datagridcombobox单元格更改为textbox?,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我需要将第一行的第一个单元格更改为空白文本框。 现在我将该列作为datagridviewcombobox列? <DataGridComboBoxColumn Header="And/Or" Width="60" ItemsSource="{Binding Source={StaticResource PredicateCombinationOperatorsEnumValues}}" SelectedItemBinding="{Binding Pr

我需要将第一行的第一个单元格更改为空白文本框。 现在我将该列作为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>

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

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


  }
}

公共类CustomTemplateSelector:DataTemplateSelector
{
公共数据模板文本模板
{get;set;}
公共数据模板组合模板
{get;set;}
公共覆盖数据模板SelectTemplate(对象项,DependencyObject容器)
{
MyObject obj=作为MyObject的项目;
如果(obj!=null)
{
//自定义逻辑以选择适当的数据模板并返回
}
其他的
返回基地。选择模板(项目、容器);
}
}
}
更多信息请点击此处查看

                    <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>

您好,您可以与我们共享您用于设置网格的XAML吗?我会将此列更改为模板列,并将可见性属性绑定到与行号相关的任何属性。我想你应该在你的模型中添加一个额外的属性。你为什么要改变网格中的一个单元格?我觉得这是个坏主意…我想换手机的原因。第一行的第一个单元格不可编辑,且为空白文本。
                    <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>