1

我有一个 ListView,它有一个 ObservableCollection 作为它的 ItemsSource,它有几个列。其中之一是状态列,根据项目的当前状态,显示不同的消息。目前这是作为基本字符串实现的,虽然它可以工作,但它远非漂亮或用户友好。我希望能够改变输出类型以更适合项目的状态。

我确实做了一些研究,并且知道我需要使用 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>

如果您进一步分支代码,那么代码会变得有点疯狂,但这是一种方法。

编辑: setter 应该设置 theContentTemplate而不是Content,否则显然不会创建新控件,并且只有一行显示正确的内容,因为内容只能有一个父级。

于 2011-05-06T08:51:17.983 回答