2011-05-06 103 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