C# XAML强制自动生成列使用自定义数据模板

C# XAML强制自动生成列使用自定义数据模板,c#,wpf,xaml,templates,datagrid,C#,Wpf,Xaml,Templates,Datagrid,背景:处理大量数据的项目,创建分析工具 问题:DataGridTemplateColumn不支持绑定。我需要使用相同的模板创建很多datagrid,但绑定不同 mc:Ignorable=“d” > Visual Studio: !() 跑步应用程序: !() 为什么数据模板在VisualStudio中以设计模式显示,但在我使用完全相同的数据源启动应用程序时却没有显示 关键是DataGridTemplateColumn不属于可视树。因此,StaticResource标记无法检索您在UserC

背景:处理大量数据的项目,创建分析工具

问题:DataGridTemplateColumn不支持绑定。我需要使用相同的模板创建很多datagrid,但绑定不同

mc:Ignorable=“d”
>

Visual Studio: !()

跑步应用程序: !()


为什么数据模板在VisualStudio中以设计模式显示,但在我使用完全相同的数据源启动应用程序时却没有显示

关键是
DataGridTemplateColumn
不属于可视树。因此,StaticResource标记无法检索您在UserControl资源字典中声明的资源,因为DataGridTemplateColumn和您的UserControl之间没有“连接”

可能您可以考虑使用代码创建DATA模板。 看看这里

Xaml

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:data="clr-namespace:WpfApplication1"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <ObjectDataProvider x:Key="designData" 
                        ObjectType="{x:Type data:DesignData}"
                        MethodName="GetVenstreOversiktSkuff"/>
        <CollectionViewSource x:Key="cv" Source="{StaticResource designData}"/>

    </UserControl.Resources>

    <DataGrid x:Name="dg2" ItemsSource="{Binding Source={StaticResource cv}}" AutoGenerateColumns="true"
              AutoGeneratingColumn="dg2_AutoGeneratingColumn" />
</UserControl>
private void dg2_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    DataGridTemplateColumn dataGridTemplateColumn = new DataGridTemplateColumn();

    FrameworkElementFactory fefTextBlock1
        = new FrameworkElementFactory(typeof(TextBlock));
    fefTextBlock1.SetValue(TextBlock.TextProperty, "Kassett");

    FrameworkElementFactory fefTextBlock2
        = new FrameworkElementFactory(typeof(TextBlock));
    fefTextBlock2.SetBinding(TextBlock.TextProperty, new Binding("KassettNr"));

    FrameworkElementFactory fefTextBlock3
        = new FrameworkElementFactory(typeof(TextBlock));
    fefTextBlock3.SetBinding(TextBlock.TextProperty, new Binding("Varenr"));

    FrameworkElementFactory fefTextBlock4
        = new FrameworkElementFactory(typeof(TextBlock));
    fefTextBlock4.SetBinding(TextBlock.TextProperty, new Binding("Varenavn"));

    FrameworkElementFactory fefStackPanel
        = new FrameworkElementFactory(typeof(StackPanel), "stackPanel");

    fefStackPanel.SetBinding(FrameworkElement.DataContextProperty,
        new Binding(e.PropertyName));
    fefStackPanel.SetValue(FrameworkElement.MarginProperty, new Thickness(5));
    fefStackPanel.AppendChild(fefTextBlock1);
    fefStackPanel.AppendChild(fefTextBlock2);
    fefStackPanel.AppendChild(fefTextBlock3);
    fefStackPanel.AppendChild(fefTextBlock4);

    dataGridTemplateColumn.CellTemplate = new DataTemplate();
    dataGridTemplateColumn.CellTemplate.VisualTree = fefStackPanel;
    dataGridTemplateColumn.CellTemplate.Seal();

    e.Column = dataGridTemplateColumn;
}
我希望它能帮助你

private void dg2_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    DataGridTemplateColumn dataGridTemplateColumn = new DataGridTemplateColumn();

    FrameworkElementFactory fefTextBlock1
        = new FrameworkElementFactory(typeof(TextBlock));
    fefTextBlock1.SetValue(TextBlock.TextProperty, "Kassett");

    FrameworkElementFactory fefTextBlock2
        = new FrameworkElementFactory(typeof(TextBlock));
    fefTextBlock2.SetBinding(TextBlock.TextProperty, new Binding("KassettNr"));

    FrameworkElementFactory fefTextBlock3
        = new FrameworkElementFactory(typeof(TextBlock));
    fefTextBlock3.SetBinding(TextBlock.TextProperty, new Binding("Varenr"));

    FrameworkElementFactory fefTextBlock4
        = new FrameworkElementFactory(typeof(TextBlock));
    fefTextBlock4.SetBinding(TextBlock.TextProperty, new Binding("Varenavn"));

    FrameworkElementFactory fefStackPanel
        = new FrameworkElementFactory(typeof(StackPanel), "stackPanel");

    fefStackPanel.SetBinding(FrameworkElement.DataContextProperty,
        new Binding(e.PropertyName));
    fefStackPanel.SetValue(FrameworkElement.MarginProperty, new Thickness(5));
    fefStackPanel.AppendChild(fefTextBlock1);
    fefStackPanel.AppendChild(fefTextBlock2);
    fefStackPanel.AppendChild(fefTextBlock3);
    fefStackPanel.AppendChild(fefTextBlock4);

    dataGridTemplateColumn.CellTemplate = new DataTemplate();
    dataGridTemplateColumn.CellTemplate.VisualTree = fefStackPanel;
    dataGridTemplateColumn.CellTemplate.Seal();

    e.Column = dataGridTemplateColumn;
}