我想设置ListView
的样式,以便在填充后外观会发生变化。我发现在ItemContainerGenerator
中有一个名为ListView
的内容包含Status
属性,一旦完成(我认为),它将被设置为ContainersGenerated
。< / p>
因此,为了实现这一目标,我认为最好的方法是定义一个样式数据触发器以触发该属性。
但它不起作用(当然)。我所看到的是输出中的以下错误 -
System.Windows.Data Error: 17 : Cannot get 'Status' value (type 'GeneratorStatus') from '' (type 'ListView'). BindingExpression:Path=(ItemContainerGenerator.Status); DataItem='ListView' (Name=''); target element is 'ListView' (Name=''); target property is 'NoTarget' (type 'Object') TargetException:'System.Reflection.TargetException: Object does not match target type.
at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
at MS.Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level)
at MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'
在提问时符合Minimal, Complete and Verifiable Example要求 -
运行程序。获取数据错误。默默地哭泣。
<Window
x:Class="MCVE.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MCVE"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<ListView>
<ListView.Style>
<Style TargetType="{x:Type ListView}">
<Style.Triggers>
<DataTrigger
Binding="{Binding
(ItemContainerGenerator.Status),
RelativeSource={RelativeSource Self}}"
Value="{x:Static GeneratorStatus.ContainersGenerated}">
<!-- This is where I'd put my setters - IF THE TRIGGER WORKED!!! -->
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.Style>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Margin" Value="0" />
<Setter Property="Padding" Value="0" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid HorizontalAlignment="Center" Rows="1" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListViewItem>Foo</ListViewItem>
<ListViewItem>Bar</ListViewItem>
<ListViewItem>Baz</ListViewItem>
</ListView>
</Window>
(不幸的是因为它全部在XAML中,我必须将整个代码块包装在`以使其显示)
那么如何正确创建一个数据触发器,当ListView
完成填充时会触发?
答案 0 :(得分:1)
删除ItemContainerGenerator.Status周围的括号。适合我。顺便说一句,如果你正在使用回收,你滚动时会不断切换状态。听起来你应该使用回收和虚拟化,如果你的列表需要很长时间才能填充。正常&#34;正常&#34;物品数量,用户甚至不会看到未完成的状态,因为它会立即发生。