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