5

この方法でWPFListViewを介して提示したいデータのセットがあります。

列1列2列3
--GroupName1--
Item1 part2 part3
Item2 part2 part3
--GroupName2--
Item3 part2 part3
Item4 long_text_in_both_columns
Item5 part2 part3
--GroupName1--
Item6 part2 part3
Item7 long_text_in_both_columns
--GroupName3--
Item8 part2 part3

私はこの基本的なサンプルで作業することから始めています:http://msdn.microsoft.com/en-us/library/ms771309 (VS.90).aspx

上記のItem4とItem7には長いテキストがあり、残りの列にまたがりたいと思います(元の列見出しの目的は無視します)。これどうやってするの?

デフォルトのGridViewRowPresenterをカスタムTextBlockに置き換えるためのDataTriggerを使用したXAMLセットアップがすでにいくつかありますが、これは私が探しているものではありません。列1のデータを正常に表示し、最初の列の幅を認識する必要があります。

4

3 に答える 3

7

これが私が適切なListViewでこれを解決することになった方法です:

        <ListView.ItemContainerStyle >
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ShowAcrossColumns}" Value="True">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListViewItem}">
                                    <Grid>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="{Binding ElementName=myListView, Path=View.Columns[0].Width}" />
                                                <ColumnDefinition Width="*" />
                                            </Grid.ColumnDefinitions>
                                            <TextBlock Grid.Column="0" Padding="6,3,6,3" Text="{Binding Column1Text}" />
                                            <TextBlock Grid.Column="1" Padding="6,3,6,3" Text="{Binding ColumnSpanningText}" />
                                        </Grid>
                                    </Grid>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListViewItem}">
                            <Grid>
                                <GridViewRowPresenter />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>

重要なのは、DataTriggeredテンプレートがGridViewRowPresenterを使用せず、代わりに独自のグリッドでの使用を偽造することです。GridViewRowPresenterが内部で使用するものとある程度一致させるには、一部のパディング/マージンを推測する必要がありました。もう1つの注意が必要な部分は、内部グリッド列を全体的なListView列幅にバインドすることでした。その後、列のサイズ変更は期待どおりに機能します。

于 2010-12-17T15:37:55.043 に答える
0

このためには、ListViewの代わりにListBoxを使用し、そのItemTemplateを使用して各列を分割すると思います。

<ListBox>
<ListBox.ItemTemplate>
 <DataTemplate>
  <StackPanel>
    <TextBlock Text="{Binding Text1}"/>
    <TextBlock Text="{Binding Text2}" />
  </StackPanel>
 </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

このようにして、トリガーをいくつかのデータに入れるか、いくつかのデータに基づいて配置する機会があります。1つのコントロールを非表示にして、長いテキストを表示することができます。

:)

于 2010-10-19T20:24:38.210 に答える
0

同様の問題があります。いくつかの行に、5番目(9列中)の列から始まる複数列にまたがるアイテムを含める必要があります。@PeteVasiの回答にバリエーションを実装しましたが、主に2つの変更があります。

  • ActualWidthではなくバインドしたい場合Width、または列が自動サイズ設定されている場合など、正しく機能しません。
  • RelativeSource名前による指定を回避するために使用できますmyListView(これにより、スタイルリソースでの使用により適したものになります)。

これを行うには、エントリのWidth割り当てを次のように変更します。ColumnDefinition

Width="{Binding ElementName=myListView, Path=View.Columns[0].Width}"

これに:

Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
    AncestorType={x:Type ListView}}, Path=View.Columns[0].ActualWidth}"

さらに、ネストされたを使用する必要はありません<Grid>。マウスオーバーと選択の強調表示の効果を維持したい場合は、デフォルトのスタイルを複製する必要があります。

を使用する回答のマイナーなバリエーションを試してみましたGridViewRowPresenterが、悪い考えで遊んでいました(列のサイズ変更イベントを監視し、それらを使用して列幅がバインドされるプロパティを設定しました)。フルスタイルバージョンを含むさまざまな実験は、githubのDisasmUiTestプロジェクトにあります。

于 2019-05-23T00:13:23.950 に答える