我想根据数据值更改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中运行相同的应用程序时,一开始它工作正常,但是当我向上滚动然后向下滚动时,返回到开始时正常的原始视图,现在其他项目也是红色。
我缺少什么?
答案 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
的某些属性,您可以使用我提供的第一种方法。