【问题标题】:How to create a standard DataTemplate for DataGridTemplateColumn?如何为 DataGridTemplateColumn 创建标准的 DataTemplate?
【发布时间】:2011-05-04 12:59:58
【问题描述】:

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

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

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

【问题讨论】:

标签: wpf datagrid binding styles wpftoolkit


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 好吧,我的问题是我有多个列,它们的文本绑定不同。但我不能在 DataTemplate Text={TemplateBinding TextXX}...
      • 我确定有办法解决这个问题...例如,您可以使用 DataGridTextColumns 绑定数据,然后在该列的样式中覆盖模板以使用您自己的 DataTemplate 并访问通过相对源绑定。尚未测试语法,但类似于{Binding RelativeSource={AncestorType={x:Type DataGridTextColumn}}, Path=Binding}。您还可以在 DataGridTemplateColumn 上使用自定义 DependencyProperty 来存储绑定而不是 DataGridTextColumn。
      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多