我的目标是在 WPF 数据网格列中创建一个就地编辑器来编辑大文本。
我的数据源是一个 DataTable,它可以包含来自不同表和字段的数据,这就是为什么我没有任何定义的类型可以绑定。在我的示例中,它有 1 个名为“Test”的列。现在我编写了一些 XAML 代码来定义我的列:
<ControlTemplate x:Key="ExtendedTemplate">
<StackPanel>
<TextBox Text="{Binding Test}" Width="200" Height="100" AcceptsReturn="True" TextWrapping="Wrap"/>
</StackPanel>
</ControlTemplate>
<DataGrid x:Name="grid" ItemsSource="{Binding}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="TEST Column" Width="200">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsDropDownOpen="True">
<ComboBoxItem Template="{StaticResource ExtendedTemplate}"/>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Test}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
这是我的测试数据源:
Source = new DataTable("Test");
Source.Columns.Add("Test");
Source.Rows.Add("Item 1 - large amount of text ...");
Source.Rows.Add("Item 2");
Source.Rows.Add("Item 3");
grid.DataContext = Source;
这很好用,但我需要做的最后一件事是在网格单元处于编辑模式时装饰网格单元,并且我在扩展组合中输入文本:
这很重要:首先 - 组合框未绑定到任何 ItemsSource,但任何单元格都存在单个 ComboBoxItem 并包含来自该单元格的文本。
第二 - 我无法将 DataTemplate 定义为 SelectedItem,因为 ComboBox.SelectionBoxItemTemplate 属性是只读的。
有谁知道我怎样才能将 SelectionBoxItem 的数据模板替换为这样的东西?
<DataTemplate>
<TextBlock Text="{Binding Test}"/>
</DataTemplate>
我尝试使用命令“编辑模板 - 编辑副本...”为组合框创建自定义样式。有很多标记,我不想在这里发布。这是我编辑的一小部分。
<ContentPresenter ContentTemplate="{StaticResource SimplestTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
Content="{TemplateBinding SelectionBoxItem}"
ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}"
IsHitTestVisible="false"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"/>
它不起作用,因为 id 不知道如何编写应该将数据绑定到我的“测试”字段的“简单模板”。