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>
这默认为所需的行为。我感觉我的行为不一致,因为可以编辑 TextBox
而 Textblock
不能。因此一个
单击会 select TextBox
但不会恢复到单元格编辑模板。
我有以下 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>
这默认为所需的行为。我感觉我的行为不一致,因为可以编辑 TextBox
而 Textblock
不能。因此一个
单击会 select TextBox
但不会恢复到单元格编辑模板。