4

在我们的数据网格中,我们使用一个ItemTemplateSelector基于绑定到特定单元格的数据在两个数据模板之间切换。

由于列数取决于我们AutoGenerateColumnsDataGrid.

看起来这种特殊的组合不能很好地工作——
模板选择器甚至没有被调用。

我们可以在自动创建列的数据网格中使用模板选择器吗?

更具体地说:这是否可能仅使用 XAML而无需将逻辑放入代码隐藏文件或使用自定义行为?

我们的数据网格定义相当简单:

 <DataGrid
     ItemTemplateSelector="{StaticResource myCustomDataTemplateSelector}"
     ItemsSource="{Binding MyData}">
     <DataGrid.Columns>
     </DataGrid.Columns>
 </DataGrid>

项目模板选择器定义

<UserControl.Resources>
    <ResourceDictionary>
        <helpers:CustomDataTemplateSelector x:Key="myCustomDataTemplateSelector"/>
    </ResourceDictionary>
</UserControl.Resources>
4

2 回答 2

6

第一的,

ItemTemplate 和 ItemTemplateSelector 是继承的属性,它们在 DataGrid 中被故意忽略,因为它们并没有像在 ItemsControl 中那样真正应用于 DataGrid。

其次,如果您的意思是要根据其值修改单元格模板,则您正在寻找CellTemplateSelector, 在DataGridTemplateColumn.

但是,当您自动生成列时,它已经自动选择了基础类型。

GeneratingColumns您可以在事件中覆盖该行为。

请参阅:Force DataTemplateCell with CellTemplateSelector in WPF DataGrid Autogenerated columns

如果您需要更多控制,您可能需要查看https://zamjad.wordpress.com/2011/09/17/datagrid-with-dynamic-columns-revisited/

于 2014-12-29T12:06:46.363 回答
0

我最近遇到了这个问题并以这种方式解决了它:

我们可以继承类DataGridBoundColumn

public class DataGridProcessContainerColumn : DataGridBoundColumn
{
    public DataTemplate ContentTemplate { get; set; }

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        throw new NotImplementedException();
    }

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        var control = new ContentControl();
        control.ContentTemplate = ContentTemplate;
        BindingOperations.SetBinding(control, ContentControl.ContentProperty, Binding);
        return control;
    }
}

接下来,在生成列的事件处理程序中,我执行以下操作:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    DataTemplate template = null;

    // Four lines below replace the DataTemplateSelector
    // You need to select the desired template according to your conditions
    if (e.PropertyType.IsAssignableFrom(typeof(IEnumerable<MyClass2>)))
        template = (DataTemplate)Resources["MyClass2CollectionTemplate"];
    else if (e.PropertyType.IsAssignableFrom(typeof(MyClass2)))
        template = (DataTemplate)Resources["MyClass2Template"];

    if (template != null)
    {
        var col = new DataGridProcessContainerColumn();
        col.Binding = (e.Column as DataGridBoundColumn).Binding;
        col.ContentTemplate = template;
        col.Header = e.Column.Header;
        e.Column = col;
    }
}

在窗口的资源中,我有相应的模板。

可以通过 DataTemplateSelector 来做,但是没有时间。

于 2017-12-28T02:09:16.270 回答