WPF DataGrid: ColumnHeaderStyle ContentTemplate не отображается в полную высоту до изменения размера - PullRequest
1 голос
/ 05 декабря 2009

Это может быть ошибка в наборе инструментов WPF DataGrid.

В моем Windows.Resources я определяю следующее ColumnHeaderStyle:

<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding Data}" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Поскольку мои столбцы генерируются динамически, я определяю столбцы в коде:

private void CreateColumn(Output output, int index)
{
    Binding textBinding = new Binding(string.Format("Relationships[{0}].Formula", index));
    DataGridTextColumn tc = new DataGridTextColumn();
    tc.Binding = textBinding;
    dg.Columns.Add(tc);
    tc.Header = output;
}

, где Output - простой класс со свойствами Name и Data (string).

Что я наблюдаю, так это то, что только свойство Name (первый TextBlock элемент управления в ContentTemplate 'StackPanel) отображается . Когда я перетаскиваю один из этих заголовков столбцов, я вижу весь заголовок (включая данные TextBlock). Только после изменения размера одного из столбцов вручную заголовки столбцов отображаются правильно . Есть ли способ, чтобы заголовки столбцов правильно отображались в коде?

Обновление: по запросу, вот остаток моего кода для воспроизведения.

public class Input
{
    public Input() 
    {
        Relationships = new ObservableCollection<Relationship>();
    }

    public string Name { get; set; }
    public string Data { get; set; }

    public ObservableCollection<Relationship> Relationships { get; set; }
}

public class Output
{
    public Output() { }

    public string Name { get; set; }
    public string Data { get; set; }
}

public class Relationship
{
    public Relationship() { }

    public string Formula { get; set; }
}

Вот разметка XAML:

<Window x:Class="GridTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit">
    <Window.Resources>
        <SolidColorBrush x:Key="RowHeaderIsMouseOverBrush" Color="Red" />
        <SolidColorBrush x:Key="RowBackgroundSelectedBrush" Color="Yellow" />
        <BooleanToVisibilityConverter x:Key="bool2VisibilityConverter" />

        <Style x:Key="RowHeaderGripperStyle" TargetType="{x:Type Thumb}">
            <Setter Property="Height" Value="2"/>
            <Setter Property="Background" Value="Green"/>
            <Setter Property="Cursor" Value="SizeNS"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Thumb}">
                        <Border Padding="{TemplateBinding Padding}"
                Background="{TemplateBinding Background}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="{Binding Name}" />
                            <TextBlock Text="{Binding Data}" />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <!-- from http://www.codeplex.com/wpf/WorkItem/View.aspx?WorkItemId=9193 -->
        <Style x:Name="RowHeaderStyle" x:Key="RowHeaderStyle" TargetType="my:DataGridRowHeader">
            <Setter Property="Content" Value="{Binding}" />
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Path=Content.Name, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type my:DataGridRowHeader}}}" 
                                       VerticalAlignment="Center"/>
                            <TextBlock Padding="5">|</TextBlock>
                            <TextBlock Text="{Binding Path=Content.Data, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type my:DataGridRowHeader}}}"
                                       VerticalAlignment="Center"/>
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <DataTemplate x:Key="CellTemplate">
            <StackPanel>
                <TextBox Text="{Binding Formula, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="CellEditTemplate">
            <StackPanel>
                <TextBox Text="{Binding Formula, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>

    </Window.Resources>
    <Grid>
        <my:DataGrid Name="dg" 
                     ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}"
                     RowHeaderStyle="{StaticResource RowHeaderStyle}"
                     HeadersVisibility="All" />
    </Grid>
</Window>

И, наконец, код позади:

/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        Inputs = new List<Input>();
        Outputs = new List<Output>();

        Input i1 = new Input() { Name = "I 1", Data = "data 1" };
        Input i2 = new Input() { Name = "I 2", Data = "data 2" };


        Inputs.Add(i1); Inputs.Add(i2);

        Output o1 = new Output() { Name = "O 1", Data = "data 1" };
        Output o2 = new Output() { Name = "O 2", Data = "data 2" };
        Output o3 = new Output() { Name = "O 3", Data = "data 3" };

        Outputs.Add(o1); Outputs.Add(o2); Outputs.Add(o3);

        Relationship r1 = new Relationship() { Formula = "F1" };
        Relationship r2 = new Relationship() { Formula = "F2" };
        Relationship r3 = new Relationship() { Formula = "F3" };
        Relationship r4 = new Relationship() { Formula = "F4" };

        i1.Relationships.Add(r1);
        i1.Relationships.Add(r2);
        i2.Relationships.Add(r3);
        i2.Relationships.Add(r4);


        CreateColumn(o1, 0);
        CreateColumn(o2, 1);
        CreateColumn(o3, 2);

        dg.Items.Add(i1);
        dg.Items.Add(i2);
        dg.ColumnWidth = DataGridLength.SizeToHeader;
    }

    private void CreateColumn(Output output, int index)
    {
        Binding textBinding = new Binding(string.Format("Relationships[{0}].Formula", index));
        DataGridTextColumn tc = new DataGridTextColumn();
        tc.Binding = textBinding;
        dg.Columns.Add(tc);
        tc.Header = output;
    }

    private List<Output> Outputs { get; set; }
    private List<Input> Inputs { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 08 декабря 2009

Проблема устранена, если столбцы создаются в обработчике событий Loaded, а не в конструкторе окна.

0 голосов
/ 05 декабря 2009

При использовании простой DataGrid с ColumnHeaderStyle = "{StaticResource ColumnHeaderStyle}" и добавлении столбцов с помощью вашего метода CreateColumn я не могу повторить это: оба TextBlocks сразу отображаются нормально (на двух отдельных строках).

Не могли бы вы вставить полную декларацию DataGrid и любые другие имеющиеся у вас стили, которые она может использовать?

Кроме того, какую версию wpftoolkit вы используете? Я тестировал как июньский выпуск, так и DataGrid, включенный в .NET 4 Beta 2.

...