如何为DataGridTemplateColumn创建标准DataTemplate?

发布于 2024-09-30 14:41:49 字数 3511 浏览 1 评论 0原文

我有一个 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 因为我有很多这样的列,只有列中文本的绑定以及列中的文本绑定有所不同他们的标题。

到目前为止,我已经尝试为此创建一个样式,但这行不通,我尝试创建一个用户控件(但我认为这就像拿大锤敲开坚果)。

因此,任何帮助或提示如何解决这个问题将不胜感激。

I've got a DataTemplate for a DataGridTemplateColum wich looks like this:

                <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>

Now I want to make a StandartTemplate for this Type because I've got many Colums like this, with only differ in the bindings of the texts in the colums as well as in their headers.

As far I've tried to make a Style for this, but this won't work, I tried to create an usercontrol (but I think it's like taking a sledgehammer to crack a nut).

So any help or hint how to solve this problem would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

彩虹直至黑白 2024-10-07 14:41:49

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

它们远非“大锤”,对我来说似乎正是正确的解决方案。

I don't see why you've rejected the UserControl approach. UserControls are pretty lightweight. They add very little overhead at runtime. They are an extra feature in your project of course, but I usually find that to be an improvement - WPF projects with a small number of large Xaml files are typically hard to maintain.

Far from being a 'sledgehammer', they seem like exactly the right solution here to me.

青萝楚歌 2024-10-07 14:41:49

将 DataTemplate 添加到资源中,然后通过 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>

Add the DataTemplate into the Resources and then access it via a 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>
单身情人 2024-10-07 14:41:49

如果我理解你的意思,你会尝试将相同的列模板与不同的数据绑定,并具有与列数据相关的不同标题内容。因此,您可以使用“动态 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>";
        }

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

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

If I understand you, you try to bind the same column template with different data and to have different header's content relative with column data. So, you may use "dynamic XAML" (XAML used in C# code - that is dynamic) which allows you to use one template for different data.

Here a simple example.

In C# code we create DataGridTemplateColumn object:

DataGridTemplateColumn tc = new DataGridTemplateColumn();

Then we set the CellTemplate property with template which is created dynamically in special function:

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

Here is a special function which creates our template:

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>";
        }

Now you may send various information in this function as text and get the same template. You may choose the template from the information you want to put in the cell. For this you must write various function which will return various templates.

The same approach can be applied to header template.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文