如何为DataGridTemplateColumn创建标准DataTemplate?

时间:2010-11-03 14:36:36

标签: wpf datagrid binding styles wpftoolkit

我为DataGridTemplateColum提供了一个DataTemplate,如下所示:

                <toolkit:DataGridTemplateColumn  x:Name="DataGridTextColumnIstVorvorjahr"  IsReadOnly="True" SortMemberPath="SummeIstVorvorjahr">
                <toolkit:DataGridTemplateColumn.CellTemplate >
                    <DataTemplate>
                        <Grid HorizontalAlignment="Stretch" Background="Transparent" Margin="0,-5">
                            <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                                <TextBlock Panel.ZIndex="100" Style="{DynamicResource CellText}" Text="{Binding Path=SummeIstVorvorjahrGerundet, Converter={StaticResource numberFormatter}, ConverterParameter='#,0.0 T€'}"  DockPanel.Dock="Right"/>
                                <Image Panel.ZIndex="90" DockPanel.Dock="Left" MouseLeftButtonUp="FilterDataGridAnalyse_MouseDoubleClick" HorizontalAlignment="Left" Margin="5,0,0,0" Width="20" Height="20" Visibility="Hidden" Name="ImageNormal"  Source="pack://application:,,,/Cis.Common.Presentation;component/Resources/Images/Lupe.png" />
                            </DockPanel>
                        </Grid>
                        <DataTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter TargetName="ImageNormal" Property="Visibility" Value="Visible" />
                            </Trigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </toolkit:DataGridTemplateColumn.CellTemplate>
                <toolkit:DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate >
                        <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" LastChildFill="False">

                            <TextBlock x:Name="TextBlockHeaderZeile1" Text="Ist" DockPanel.Dock="Top" />
                            <WrapPanel DockPanel.Dock="Top">
                                <TextBlock x:Name="TextBlockHeaderZeile2" Text=""/>
                                <ContentPresenter x:Name="contentPresenter">
                                    <ContentPresenter.Content>
                                        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Content" />
                                    </ContentPresenter.Content>
                                </ContentPresenter>
                            </WrapPanel>
                            <Border Style="{DynamicResource borderline}">
                                <TextBlock VerticalAlignment="Stretch" x:Name="TextBlockSumme" Text="{Binding Path=KumulierteSummeIstVorvorjahr, Converter={StaticResource numberFormatter}, ConverterParameter='#,0.0 T€',  RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type cis:ChildWindow}}}"
                                       />
                            </Border>
                        </DockPanel>
                    </DataTemplate>
                </toolkit:DataGridTemplateColumn.HeaderTemplate>
            </toolkit:DataGridTemplateColumn>

现在我想为这个类型创建一个StandartTemplate,因为我有很多像这样的Colums,只是在colums和header中的文本绑定方面有所不同。

到目前为止,我已尝试为此制作样式,但这不起作用,我尝试创建一个用户控件(但我认为这就像用大锤敲打坚果一样)。

所以任何帮助或暗示如何解决这个问题将不胜感激。

3 个答案:

答案 0 :(得分:1)

将DataTemplate添加到Resources中,然后通过StaticResource

访问它
<Window>
    <Window.Resources>
        <DataTemplate x:Key="MyColumnTemplate">
            ...
        </DataTemplate>
        <DataTemplate x:Key="MyColumnTemplateHeader">
            ...
        </DataTemplate>
    </Window.Resources>

    ...

    <toolkit:DataGridTemplateColumn x:Name="DataGridTextColumnIstVorvorjahr"  IsReadOnly="True" SortMemberPath="SummeIstVorvorjahr"
        CellTemplate={StaticResource MyColumnTemplate}
        HeaderTemplate={StaticResource MyColumnTemplateHeader}

    ...
</Window>

答案 1 :(得分:1)

我不明白为什么你拒绝了UserControl方法。 UserControls非常轻量级。它们在运行时增加了很少的开销。它们当然是你项目中的一个额外功能,但我通常发现这是一个改进 - 带有少量大型Xaml文件的WPF项目通常难以维护。

它们不仅仅是一个“大锤”,它对我来说似乎是正确的解决方案。

答案 2 :(得分:0)

如果我理解您,您尝试使用不同的数据绑定相同的列模板,并使列标题的内容与列数据相关。因此,您可以使用“动态XAML”(C#代码中使用的XAML - 动态),它允许您将一个模板用于不同的数据。

这是一个简单的例子。

在C#代码中,我们创建了DataGridTemplateColumn对象:

DataGridTemplateColumn tc = new DataGridTemplateColumn();

然后我们使用模板设置CellTemplate属性,该模板是在特殊函数中动态创建的:

tc.CellTemplate = (DataTemplate)XamlReader.Parse(GetTextCellDataTemplate(someText));

这是一个创建模板的特殊功能:

public static string GetTextCellDataTemplate(string bindingPath)
        {
            return @"                
                <DataTemplate
                xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" >
                    <ScrollViewer MaxHeight=""200"" MaxWidth=""250"" VerticalScrollBarVisibility=""Auto"">
                        <TextBlock Text=""{Binding Path=" + bindingPath + @"}""
                                   TextWrapping=""Wrap"" />
                    </ScrollViewer>
                </DataTemplate>";
        }

现在您可以将此功能中的各种信息作为文本发送并获取相同的模板。您可以从要放入单元格的信息中选择模板。为此,您必须编写各种函数,它们将返回各种模板。

可以将相同的方法应用于标题模板。