我能否将DataGrid的CellTemplate定义为资源,以便在多个列中重复使用?

7

我希望为DataGrid中的所有列使用特定的模板。通常的做法是在每个列中复制整个DataTemplate的XAML多次。

是否有一种全局定义CellTemplate作为资源的方法,然后只需将“Binding”的“Path”属性传递给它,以便显示来自DataContext的正确项目?

这种做法可行吗?


Markup Extension,用hacky的方式可能是解决方案。请查看此答案,该答案源自于此答案 - Athafoud
1个回答

7
在App.Xaml文件中创建一个带有键名的数据模板。
 <DataTemplate x:Name="myTemplate" TargetType="sdk:DataGridTemplateColumn">
                <StackPanel Orientation="Horizontal">
                    <TextBox Text="{Binding FirstName}" BorderThickness="0"/>
                    <TextBox Text="{Binding LastName}" BorderThickness="0"/>
                </StackPanel>
  </DataTemplate>

现在您可以像这样在DataGrid中使用此模板:
 <sdk:DataGridTemplateColumn Header="Name" CellTemplate={StaticResource myTemplate}>

或者
您可以在代码后台中传递绑定路径名称,例如...

        string colPath = "FirstName";
        DataGrid grid = new DataGrid();
        grid.ItemsSource = myViewModel.EmpCollection;

        DataGridTemplateColumn column = new DataGridTemplateColumn();
        DataTemplate itemTemplate = (DataTemplate)XamlReader.Load("<DataTemplate xmlns=\"http://schemas.microsoft.com/client/2007\"> <ContentPresenter Content=\"{Binding Path=" + colPath + "}\"  /></DataTemplate>");

        column.CellTemplate = itemTemplate;
        grid.Columns[0] = column;

希望这能帮到您。

我需要从实际的DataGridTemplateColumn中传递Binding Path到DataTemplate,否则将需要7个不同的DataTemplates来拥有DataGrid中的7列,这比写7次相同的XAML还要糟糕。在您的示例中,我需要从实际的TemplateColumn中传递FirstName,并且它应该在DataTemplate中可用。 - teenup
嗨,Punit,如果你可以使用Code behind添加DataGrid或将列分配给你的datagrid,那么我认为你可以很好地完成它。 - dipak
实际上,我正在寻找一个XAML解决方案,我知道我可以在代码后台这样做。无论如何,因为没有回应,我相信我们现在不能在XAML中完成它。 - teenup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接