【问题标题】:How to use DataTemplateSelector with a DataGridBoundColumn?如何将 DataTemplateSelector 与 DataGridBoundColumn 一起使用?
【发布时间】:2011-11-28 23:19:29
【问题描述】:

我遵循here 中描述的简单方法,并拥有一个包含动态生成列的 DataGrid,它允许动态使用和绑定 DataTemplates。

        for (int i = 0; i < testDataGridSourceList.DataList[0].Count; i++)
        {
            var binding = new Binding(string.Format("[{0}]", i));
            CustomBoundColumn customBoundColumn = new CustomBoundColumn();
            customBoundColumn.Header = "Col" + i;
            customBoundColumn.Binding = binding;
            customBoundColumn.TemplateName = "CustomTemplate";
            TestControlDataGrid.TestDataGrid.Columns.Add(customBoundColumn);
        }

每一列都是从 DataGridBoundColumn 派生的 CustomBoundColumn 类型

public class CustomBoundColumn : DataGridBoundColumn
{
    public string TemplateName { get; set; }

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        var binding = new Binding(((Binding)Binding).Path.Path);
        binding.Source = dataItem;

        var content = new ContentControl();
        content.ContentTemplate = (DataTemplate)cell.FindResource(TemplateName);
        content.SetBinding(ContentControl.ContentProperty, binding);
        return content;
    }

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        return GenerateElement(cell, dataItem);
    }
}

我现在想使用 DataTemplateSelector 来允许每一行使用不同的 DataTemplate,而不是只使用第一个 sn-p 中显示的“CustomTemplate”。我该怎么做?

【问题讨论】:

  • 不同的 DataTemplate 取决于什么?
  • 取决于该行上显示的数据类型(我正在填充一个基类列表,但每一行实际上可能是一个不同的派生类,具有一些我想要的额外属性在DataTemplate中使用)

标签: wpf datagrid datatemplate datatemplateselector


【解决方案1】:

抱歉回复晚了。我相信解决方案很简单,只需在您的“CustomTemplate”中放置一个ContentPresenter

<DataTemplate x:Key="CustomTemplate">
    <ContentPresenter Content="{Binding}"
                      ContentTemplateSelector="{StaticResource myTemplateSelector}">
    </ContentPresenter>
</DataTemplate>

你去吧!您现在可以使用DataTemplateSelector。一个很好的例子here

【讨论】:

  • 我实现了类似的事情,而无需使用 ContentPresenter。不过同样的想法。 +1 输入
  • 您的链接已损坏,您能找到另一个示例并粘贴代码吗?
【解决方案2】:

最后我换了

content.ContentTemplate = (DataTemplate)cell.FindResource(TemplateName);

content.ContentTemplateSelector = (DataTemplateSelector)cell.FindResource("templateSelector");

其中“templateSelector”是在 XAML 代码中声明为静态资源的 DataTemplateSelector 的键。这很好用。

【讨论】:

    【解决方案3】:

    我创建了一个自定义列类,将 DataGridBoundColumn 与 DataGridTemplateColumn 组合在一起。

    您可以在该列上设置绑定和模板。

    以下是来源: gist

    【讨论】:

    • 您是如何实现编辑能力的?对我来说,一旦我开始编辑,应用程序就会崩溃并显示 Two-way binding requires Path or XPath.
    • 看看 CellEditungTemplate