DataGridTemplateColumn.CellEditingTemplate 将 TextBox 转换为 Combobox 不一致

DataGridTemplateColumn.CellEditingTemplate converting a TextBox to Combobox inconsistent

我有以下 XAML 代码:

<DataGrid ItemsSource="{Binding TempParameters}" AutoGenerateColumns="False" CanUserAddRows="False" Height="100" Name="TempParameterGrid" CanUserSortColumns="False" Width="{Binding Source={StaticResource theWidth}}" MouseDown="SetSelectedGrid">
     <DataGrid.Columns>
         <DataGridTextColumn Width="*" Header="ID"  IsReadOnly="True" Binding="{Binding ID}"/>
         <DataGridTemplateColumn Header="Parameter" IsReadOnly="False" >
             <DataGridTemplateColumn.CellEditingTemplate>
                 <DataTemplate>
                     <ComboBox SelectedValue="{Binding name, Mode=TwoWay}" ItemsSource ="{Binding ParameterNames, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
                 </DataTemplate>
             </DataGridTemplateColumn.CellEditingTemplate>
             <DataGridTemplateColumn.CellTemplate>
                 <DataTemplate>
                     <TextBox Text ="{Binding name, Mode=TwoWay}" />
                 </DataTemplate>
             </DataGridTemplateColumn.CellTemplate> 
         </DataGridTemplateColumn>
         <DataGridTextColumn Width="*" Header="Start"      IsReadOnly="False" Binding="{Binding start}"/>
         <DataGridTextColumn Width="*" Header="End"        IsReadOnly="False" Binding="{Binding end}"/>
         <DataGridTextColumn Width="*" Header="Samples"    IsReadOnly="False" Binding="{Binding samples}"/>
     </DataGrid.Columns>
 </DataGrid>

DataGrid 绑定到集合 属性 TempParameters。这是以下对象的集合。

    public class TuneParameterRecord {
        public int ID { get; set; }
        public string name { get; set; }
        public double start { get; set; }
        public double end { get; set; }
        public int samples { get; set; }
    }

所有列都是可编辑的。但是我需要名称列来包含预定义名称的列表。因此,我想提供一个带有可接受值列表的组合框(虽然很多人会 指出来,这个列表不能是一个枚举。我需要这是一个字符串列表)。这个列表是 在 window 数据上下文中提供。

我可以直接引用它,在 CellEditingTemplate 中提供相关来源。我的问题是,当我尝试编辑相关列中的单元格时,我得到一个可以编辑文本框的光标 获得组合框。

为了得到组合框。我必须在所附图片中用红色指示的区域中单击多次。第一张图片显示可以使用光标编辑单元格,而第二张图片 在我在指示的红色区域中单击多次后,图像出现了组合框(虽然被遮盖了)。

我的代码与您发布的 XAML 基本相同。但是,我的 XAML 还包括以下内容作为组合框的一部分:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <helpers:TakeFocusAction />
    </i:EventTrigger>
</i:Interaction.Triggers>

其目的是在 CellEditingTemplate 启动时将焦点置于组合框中。

TakeFocus 操作如下所示:

using System.Windows;
using System.Windows.Interactivity;

namespace Helpers
{
    public class TakeFocusAction : TriggerAction<UIElement>
    {
        protected override void Invoke(object parameter)
        {
            AssociatedObject.Focus();
        }
    }
}

您的 Xaml 中需要以下命名空间:

xmlns:helpers="clr-namespace:Helpers"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

如果您还没有,您将需要 Microsoft.Xaml.Behaviors.Wpf Nuget package,它提供了上面的交互命名空间。

所以我找到了问题所在。我已经转换了

<DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
         <TextBox Text ="{Binding name, Mode=TwoWay}" />
     </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

<DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
         <TextBlock Text ="{Binding name, Mode=TwoWay}" />
     </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

这默认为所需的行为。我感觉我的行为不一致,因为可以编辑 TextBoxTextblock 不能。因此一个 单击会 select TextBox 但不会恢复到单元格编辑模板。