2012-08-17 79 views
8

在我的Windows 8的Metro風格應用程序中,我將Listview綁定到ObservableCollection,我希望每個ListViewItem的背景顏色交替(白色,灰色,看到this page - 白色等)Metro應用程序 - ListView - 如何替代ListViewItems的背景顏色

<ListView x:Name="stopsListView" ItemsSource="{Binding}" > 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Grid Height="66" > 
        <TextBlock Text="{Binding Title}" /> 
       </Grid> 
      </DataTemplate> 
     </ListView.ItemTemplate> 

在WPF中,這是使用樣式與觸發器來完成。

你如何在Metro應用程序中完成此操作?

更新:

正確答案以下給出後,我走了,實際上它編碼。這裏的任何人一些代碼誰需要它:

爲正值轉換器類代碼:

public class AltBackgroundConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (!(value is int)) return null; 
     int index = (int)value; 

     if (index % 2 == 0) 
      return Colors.White; 
     else 
      return Colors.LightGray; 
    } 

    // No need to implement converting back on a one-way binding 
    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

代碼XAML列表視圖:

<ListView x:Name="stopsListView" ItemsSource="{Binding}"> 

     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Grid Width="250" Height="66" Margin="5"> 
        <Grid.Background> 
         <SolidColorBrush Color="{Binding IndexWithinParentCollection, Mode=OneWay, Converter={StaticResource AltBGConverter}}" /> 
        </Grid.Background> 

...,並在加入項目時收藏或修改收藏品,請記得在收藏品中設置其索引:

myCollection.add(item); 
item.IndexWithinParentCollection = myCollection.Count; 

當然,如果您的館藏經常變化,這種方法的維護成本會很高,因爲您必須重新爲您的項目建立索引,所以我發現在每個項目中存儲對父館藏的引用更容易,然後使用.IndexOf()即時計算索引,以避免每次收集更改時不斷更新索引值。

回答

5

您可以使用轉換器 - 從項目中獲取行索引並將其轉換爲畫筆。另外 - 如果ItemTemplate沒有給你足夠的控制權 - 使用ItemContainerStyle在ListViewItem模板級別修改畫筆。

另一個選項可能是指定一個ItemTemplateSelector,它根據一個項目給你一個不同的模板和不同的畫筆。您仍需要生成行索引,或者以某種方式啓用選擇器來確定項目是處於偶數還是奇數位置。

+0

我想知道的是我自己,但你會如何打發行索引到轉換器?是否有一些XAML語法來做到這一點,還是我必須明確告訴每個對象它的索引在集合中是什麼? – 2012-08-17 17:27:12

+0

您需要向對象添加屬性,是的。然後做一些像Background =「{Binding ItemIndex,Converter = {StaticResource ItemIndexToBackgroundConverter}}」 – 2012-08-17 17:33:04

+0

這是正確的答案,謝謝。真的很遺憾,沒有XAML語法將項索引傳遞給轉換器。也許我可以設置項目來引用他們自己的父集合,並使用.indexOf--這種方法感覺它可能會破壞各種規則。 – 2012-08-17 20:37:10

1

沒試過,如果這樣做的造型像這一點,但什麼:

綁定背景顏色有些人的物業和財產將通過的IValueConverter根據列表視圖也許指數當前項目的設置。

如果我有任何意義。

編輯:

有趣的事情,而我在寫我的回答,菲利普Skakun帶着完全相同的想法。

+0

我第一次來這裏。 :) – 2012-08-17 17:32:02

+0

嗯,我打字我的想法,太緩慢壓力(如果我錯了),然後我注意到彈出'有人已經回答,當你玩slowpoke':) – Oleg 2012-08-17 17:34:08

+0

有趣的事情,StackOverflow是。 :) – 2012-08-17 19:09:17

0

我在網上搜索,發現了一種技術,包括添加索引屬性問題的模型,然後添加一個轉換器到的DataTemplate。這並不理想,因爲它只改變了列表項的內容,所以根據填充和內容對齊,您會看到行背景周圍的空白。我也不喜歡用UI代碼修改我的數據模型對象的代碼味道。

試試這個它會幫助, http://www.bendewey.com/index.php/523/alternating-row-color-in-windows-store-listview

相關問題