PrepareContainerForItemOverride在桌面中的工作方式与在Mobile UWP中的工作方式不同

时间:2016-07-25 16:12:41

标签: xaml windows-10 uwp

我想根据数据值更改ListView项的颜色。 这很容易做到:

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

但问题是UWP不支持Setter Properties中的绑定。 我的第二次尝试是覆盖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);
    }
}

上述代码可以在装有Windows 10和UWP的PC上正常运行。它根据基础数据以红色显示一些项目。当我在Windows Mobile中运行相同的应用程序时,一开始它工作正常,但是当我向上滚动然后向下滚动时,返回到开始时正常的原始视图,现在其他项目也是红色。

我缺少什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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的{​​{1}}属性或像这样将ListView设置为Background

ListView

所以我假设您要修改listView.Background = new SolidColorBrush(Colors.Red); 中的根控件,例如以下xaml中的DataTemplate

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> 中所有ListViewItem的某些属性,您可以使用我提供的第一种方法。

相关问题