属性更改时如何在ListBox中刷新项目

时间:2014-03-25 09:40:32

标签: wpf inotifypropertychanged

我有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中)?

1 个答案:

答案 0 :(得分:0)

我不确定我是否遵循了这一点,您是否只想在ListViewItemSize属性发生变化时说出Price

如果是这样,您应该可以使用Binding.TargetUpdated事件触发器执行此操作。您确实需要确保绑定中SizePrice的绑定也指定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>。就个人而言,我只使用了第一种方法,因为它稍微简单一些。