2011-05-06 55 views
0

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

我的确做了一些研究,并且知道我需要使用CellTemplate来影响显示,但是所有不同类型的模板都会让我感到无法确定下一步该怎么做。

我的代码(不包括很多其他的ListView绒毛)如下:

<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的经验很少,但这正是我希望有人经历可以让我直接设置用一些基本的代码之前,我已经比我更糟糕的东西混乱。 :)

回答

5

您可以使用触发器更改单元格的内容,例如,

<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,显然否则没有新的控件可以创建和只有一排显示由于内容的正确内容只能有一个父。

+0

太棒了。我花了一些时间让所有事情都按照我想要的方式工作(虽然我可能还得弄清楚如何使用多个控件),但现在我完全是extatic,在那里有一个进度条。谢谢你的帮助。 :) – Stigma 2011-05-08 16:28:28

+0

不客气,很高兴它帮助:) – 2011-05-08 16:30:35

+0

+1,正是我所期待的。 – 2012-08-21 11:09:52