2016-07-25 35 views
0

我想根據數據值更改ListView項目的顏色。 這將是很容易做的:PrepareContainerForItemOverride在桌面工作方式與移動UWP不同

<ListView.ItemContainerStyle> 
     <Style TargetType = "ListViewItem" > 
     < Setter Property="Background" Value="{Binding EventType, Converter={StaticResource EventTypeToBackColorConverter}}" /> 
</ListView.ItemContainerStyle> 

但問題是,UWP不支持setter屬性綁定。 我的第二次嘗試重寫的ListView PrepareContainerForItemOverride:

public class EventListView : ListView 
{ 
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     base.PrepareContainerForItemOverride(element, item); 
     var listViewItem = element as ListViewItem; 
     var ev = item as EventType; 
     if(ev.Warning) 
      listViewItem.Background = new SolidColorBrush(Color.Red); 
    } 
} 

上面的代碼工作正常運行在PC與Windows 10和UWP。它根據基礎數據以紅色着色一些項目。當我在Windows Mobile中運行相同的應用程序時,在開始時它工作正常,但是當我向上滾動,然後向下滾動時,返回到原始視圖,在開始時可以,現在其他項目也是紅色。

我缺少什麼?

回答

1

我不知道原因,但下面的代碼工作對我來說:

public class EventListView : ListView 
{ 
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     base.PrepareContainerForItemOverride(element, item); 
     var listViewItem = element as ListViewItem; 
     var ev = item as EventType; 
     if(ev.Warning) 
      listViewItem.Background = new SolidColorBrush(Color.Red); 
     else 
      listViewItem.Background = null; 
    } 
} 

我已經加入listViewItem.Background = null

0

這是因爲當有大量的項目時,默認ListView已經實現了數據虛擬化功能。禁用此功能並不是一個好主意,因爲它可以實現更好的性能。

但是對於您的情況,有一種更簡單的方法來解決您的問題。既然你要修改的ListViewItem風格後面的代碼中,我們不能修改已有的一個,我們可以設置的ListViewItem新的樣式ListView例如像這樣:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var dynamicStyle = new Style(); 
    dynamicStyle.TargetType = typeof(ListViewItem); 
    dynamicStyle.Setters.Add(new Setter(BackgroundProperty, Colors.Red)); 
    listView.ItemContainerStyle = dynamicStyle; 
} 

只有一個問題是,如果你正在設置Background財產所有ListViewItem,它並沒有比這樣的Background數據綁定到的ListViewBackground屬性或設置爲ListView區別:

listView.Background = new SolidColorBrush(Colors.Red); 

所以,我只是假設你要修改的根控制在DataTemplate例如像下面的XAML的Grid

<ListView x:Name="listView" ItemsSource="{x:Bind collection}"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem" x:Name="myListItemStyle"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <TextBlock Text="{Binding Testtext}" /> 
      </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

那麼在這種情況下,你可以使用數據可能結合這樣的:

<DataTemplate> 
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{Binding EventType, Converter={StaticResource EventTypeToBackColorConverter}}"> 
     <TextBlock Text="{Binding Testtext}" /> 
    </Grid> 
</DataTemplate> 

無論如何,如果您堅持要更改ListView中所有ListViewItem的部分屬性,您可以使用我提供的第一種方法。

+0

謝謝你的答覆。事情是,每個項目可以有不同的顏色,所以ListView.Background不會是一個解決方案。第二個選項,使用DataTemplate,對我來說不起作用,因爲顏色不會填滿整個矩形,就像選區一樣。有餘量。 – kokokok

相關問題