11

私はかなり単純な目標を持っていると思いますが、それに到達することはできません。

私が達成したいのは、ヘッダー付きの ItemsControl (リストの選択機能が必要ないため) を持つことだけです。できれば静的ヘッダー。

現在、ヘッダーにグリッドを使用し、そのグリッドを ItemsControl の ItemTemplate (DataTemple) にコピーしてから、それらをグリッド内で上下に配置しています。それはちょっと機能しますが、常にうまく並ぶとは限りません。

次に、素晴らしいアイデアだと思った HeaderedItemsControl を見つけましたが、機能させることができません。ヘッダーがまったく表示されません。私は次のことを試しました。

  • Xamlの「ヘッダー」にテキストを入力するだけです
  • ItemsControl.Header タグ内に静的テキストを含む TextBlocks を含むグリッドを配置する
  • HeaderTemplate (Datatemplate) 内にグリッドを配置し、単純なオブジェクトにバインドする

小さなプロジェクトでこれをすべて Blend で行ってから、実稼働アプリに移行します。作成した単純なサンプル データ ソースを使用しているだけです。

ここでボートを完全に見逃しているかもしれませんが、助けていただければ幸いです。

私の現在のコードは次のとおりです。最初は私の HeaderedItemsControl です

<HeaderedItemsControl Header="HeaderedItemsControl"  
        ItemsSource="{Binding Collection, Mode=Default}" 
        ItemTemplate="{DynamicResource ItemsControlDataTemplate}" 
        HeaderTemplate="{DynamicResource ItemsControlHeaderDataTemplate}"/>

次に、期待どおりに機能する ItemTemple を取得しました

<DataTemplate x:Key="ItemsControlDataTemplate">
        <Grid d:DesignWidth="268">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.754*"/>
                <ColumnDefinition Width="0.246*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding Property1, Mode=Default}" TextWrapping="Wrap" d:LayoutOverrides="Height" HorizontalAlignment="Stretch" Margin="0" />
            <TextBlock Text="{Binding Property2, Mode=Default}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1" HorizontalAlignment="Left" Margin="0" />
        </Grid>
    </DataTemplate>

そして、その労働倫理に反抗的に反対しているヘッダー、私はバインディングと TextBlock.Text プロパティのプレーンテキストだけで試しました

<DataTemplate x:Key="ItemsControlHeaderDataTemplate">
        <Grid d:DesignWidth="268">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.754*"/>
                <ColumnDefinition Width="0.246*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding Header.Header1, Mode=Default, Source={StaticResource SampleDataSource6}}" TextWrapping="Wrap" HorizontalAlignment="Stretch" Margin="0"/>
            <TextBlock Text="{Binding Header.Header2, Mode=Default, Source={StaticResource SampleDataSource6}}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1" HorizontalAlignment="Left" Margin="0"/>
        </Grid>
    </DataTemplate>
4

2 に答える 2

10

HeaderedItemsControl には既定のスタイルがないため、基本の ItemsControl クラスのテンプレートを使用しているだけで、ヘッダーはレンダリングされません。独自のテンプレートを定義する MenuItem、ToolBar、および TreeViewItem の基本クラスとしてフレームワークによってのみ使用されます。ヘッダーの ContentPresenter を含む独自のテンプレートを作成できます。

<HeaderedItemsControl ItemsSource="{Binding}" Header="Some text">
    <HeaderedItemsControl.Template>
        <ControlTemplate TargetType="HeaderedItemsControl">
            <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                <DockPanel>
                    <ContentPresenter DockPanel.Dock="Top" ContentSource="Header" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </DockPanel>
            </Border>
        </ControlTemplate>
    </HeaderedItemsControl.Template>
</HeaderedItemsControl>

1 か所でのみ使用する場合は、プレーンな ItemsControl を使用して、ヘッダーをコントロール テンプレートに直接含める方が簡単な場合があります。

また、列の幅が同じ 2 つのグリッドを作成しようとしているようです。Grid Size Sharing in WPFを見たいと思うかもしれません。親コントロールに Grid.IsSharedSizeScope を設定すると、異なるグリッドの列に SharedSizeGroup を設定して同じ幅にすることができます。

于 2010-08-20T12:04:01.767 に答える
0

昨日似たようなことがありました - HeaderedContentControl については、HeaderTemplate プロパティではなく、Header を設定してみてください。

HeaderTemplate を介してバインディングを機能させることは不可能であることがわかりました - コンテンツは正しくバインディングされていました。誰かがその理由を説明してくれたら、とても興味があります。

上記の回避策が役立つことを願っています。

クリス

于 2010-08-20T08:06:53.520 に答える