我有ListView
绑定到List
以下类型的项目:
class Item : INotifyPropertyChanged
{
//Both these props have property change notification implemented. Left out for brevity.
int Price{get;set}
int Size{get;set}
}
我要在DataTemplate
ListView
列表的大小不会改变,但列表中项目的属性值会改变。假设我首先有三个这样的项目:
Item format : Size@Price
{(10@34), (15@37), (10@38)}
现在假设第一项仅因数据更新而发生变化:
{(15@34), (15@37), (10@38)}
请注意,我不会删除现有项目。我只改变它的属性。因此,每次更改都会触发属性更改通知。我希望在这样的更改时突出显示/刷新ListView
中更改的项目。我该怎么做(最好在XAML中)?
答案 0 :(得分:0)
我不确定我是否遵循了这一点,您是否只想在ListViewItem
或Size
属性发生变化时说出Price
?
如果是这样,您应该可以使用Binding.TargetUpdated事件触发器执行此操作。您确实需要确保绑定中Size
和Price
的绑定也指定NotifyOnTargetUpdated=True
才能触发此事件。
所以这样的事情应该可以正常工作:
<DataTemplate x:Key="SomeTemplate" DataType="viewModel:Item">
<StackPanel x:Name="stackPanel"
Background="Transparent"
Orientation="Vertical">
<!-- This prolly aint your layout. Just here as an example -->
<TextBlock Text="{Binding Size, NotifyOnTargetUpdated=True}" />
<TextBlock Text="{Binding Price, NotifyOnTargetUpdated=True}" />
</StackPanel>
<DataTemplate.Triggers>
<EventTrigger RoutedEvent="Binding.TargetUpdated">
<BeginStoryboard>
<Storyboard AutoReverse="True">
<!-- From="1.0" helps prevent spam property changes skewing the opacity -->
<DoubleAnimation Duration="0:0:0.3"
Storyboard.TargetName="stackPanel"
Storyboard.TargetProperty="Opacity"
From="1.0"
To="0.3" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<强>替代:强>
与xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
混合
您还应该使用<ei:PropertyChangedTrigger>
使用,然后您可以调用行为来触发Storyboard
<ei:ControlStoryboardAction>
。就个人而言,我只使用了第一种方法,因为它稍微简单一些。