Как создать стандартный DataTemplate для DataGridTemplateColumn? - PullRequest
0 голосов
/ 03 ноября 2010

У меня есть DataTemplate для DataGridTemplateColum, который выглядит следующим образом:

                <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 для этого типа, потому что у меня есть много таких столбцов, которые отличаются толькопривязки текстов в столбцах, а также в их заголовках.

Пока я пытался создать стиль для этого, но это не сработало, я пытался создать пользовательский контроль (но я думаю, что это похоже на кувалду, чтобы сломать орех).

Так что любая помощь или подсказка, как решить эту проблему, была бы оценена.

Ответы [ 3 ]

1 голос
/ 04 ноября 2010

Не понимаю, почему вы отказались от подхода UserControl.UserControls довольно легкий.Они добавляют очень мало накладных расходов во время выполнения.Конечно, они являются дополнительной функцией в вашем проекте, но я обычно нахожу это улучшением - проекты WPF с небольшим количеством больших файлов Xaml обычно трудно поддерживать.мне они кажутся совершенно правильным решением.

1 голос
/ 03 ноября 2010

Добавьте 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>
0 голосов
/ 19 июля 2011

Если я вас понимаю, вы пытаетесь связать один и тот же шаблон столбца с разными данными и иметь другое содержимое заголовка относительно данных столбца.Таким образом, вы можете использовать «динамический XAML» (XAML, используемый в коде C #, то есть динамический), который позволяет использовать один шаблон для разных данных.

Вот простой пример.

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

Теперь вы можете отправлять различную информацию в этой функции в виде текста и получать тот же шаблон.Вы можете выбрать шаблон из информации, которую хотите поместить в ячейку.Для этого вы должны написать различные функции, которые будут возвращать различные шаблоны.

Тот же самый подход может быть применен к шаблону заголовка.

...