1

ItemsSource として ObservableCollection を持つ ListView があり、いくつかの列があります。これらの 1 つは [状態] 列で、アイテムの現在の状態に応じて異なるメッセージが表示されます。現在、これは基本的な文字列として実装されており、機能する一方で、きれいでもユーザーフレンドリーでもありません。アイテムの状態により適切に出力の種類を変更できるようにしたい。

私はいくつかの調査を行い、CellTemplate を使用して表示に影響を与える必要があることを知っていましたが、さまざまな種類のテンプレートがすべて圧倒され、次にどこに行くべきかわかりません。

私のコード(他の多くのリストビューの綿毛を除く)は次のとおりです。

<ListView Name="itemsListView" ItemsSource="{Binding Source={StaticResource listingDataView}}" IsSynchronizedWithCurrentItem="True">
    ...
    <ListView.View>
         <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Item Information">
             ...
             <GridViewColumn DisplayMemberBinding="{Binding Path=StatusMessage}" Width="283" Header="Status" HeaderContainerStyle="{StaticResource GVHeaderLeftAlignedStyle}" />
         </GridView>
    </ListView.View>
</ListView>

はい、アイテムにはハードコーディングされた「ステータスメッセージ」があり、コードに実際に関連する他のプロパティと一緒に更新されるため、コードの他の場所で醜い重複が発生します。(そして、はい、これがきれいとはほど遠いことはわかっていますが、これも改善したいと考えています。)ItemState私はそれほど創造的ではないので、そのプロパティが呼び出されます。

したがって、私の質問は、この列を変更して、特定の状態に最も適した表示にする方法を教えてください。テキストによる説明は多くの状態に対応しますが、いくつかはかなり長く、その横にプログレス バーがあり、おそらく何らかの残り時間があるテキストが役立つ場合があります。別の州は、クリック可能なハイパーリンクを持つことで利益を得るでしょう。つまり、少なくとも 3 つの異なる CellTemplates が必要だと思います。

WPFの経験がほとんどない人(=私)の設計ミスに大きく悩まされているのは、かなり自由回答の質問であることを認識していますが、経験豊富な人が基本的なコードで私を正してくれることを望んでいます私が今まで以上に物事を混乱させる前に。:)

4

1 に答える 1

6

トリガーを使用して、セルの内容を変更できます。

<GridViewColumn Header="Status">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <ContentControl>
                <ContentControl.Style>
                    <Style TargetType="{x:Type ContentControl}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding StateItem.HasError}" Value="True">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <!-- Possibly create another contentcontrol which differentiates between errors -->
                                        <DataTemplate>
                                             <TextBlock Text="{Binding StateItem.Error}"
                                                        Foreground="Red"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>

                            <DataTrigger Binding="{Binding StateItem.HasError}" Value="False">
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <Image Source="Images/Default.ico"/>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

コードをさらに分岐すると、コードは少しおかしくなりますが、それを行う方法です。

編集:セッターは のContentTemplate代わりに を設定する必要Contentがあります。そうしないと、新しいコントロールが作成されず、コンテンツが 1 つの親しか持つことができないため、適切なコンテンツが 1 行だけ表示されます。

于 2011-05-06T08:51:17.983 に答える