项目添加到ListView时触发事件?

时间:2011-05-05 21:51:43

标签: wpf

我有这个XAML:

<ListView Name="NameListView"
          HorizontalAlignment="Stretch"
          VerticalAlignment="Stretch"
          Grid.Column="1">
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumn.DisplayMemberBinding>
                    <MultiBinding StringFormat="{}{0} {1}">
                        <Binding Path="First" />
                        <Binding Path="Last" />
                    </MultiBinding>
                </GridViewColumn.DisplayMemberBinding>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

ObservableCollection<Name>在我的代码隐藏中绑定到ListView的名称“names”。将新名称添加到集合时,我希望ListView更改新添加名称的背景颜色。我该怎么做呢?

2 个答案:

答案 0 :(得分:15)

您可以在listbox.Items属性上订阅ItemsChanged事件。这有点棘手,因为你必须先抛出它。订阅的代码如下所示:

((INotifyCollectionChanged)MainListBox.Items).CollectionChanged +=  ListBox_CollectionChanged;

然后在那个活动中,您可以使用以下代码访问您的项目:

private void ListBox_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems.Count > 0)
        {
            Dispatcher.BeginInvoke(() =>
            {
                var newListItem = MainListBox.ItemContainerGenerator.ContainerFromItem(e.NewItems[0]) as Control;
                if (newListItem != null)
                {
                    newListItem.Background = System.Windows.Media.Brushes.Red;
                }
            }, DispatcherPriority.SystemIdle);
        }
    }

答案 1 :(得分:1)

直接设置ListViewItem的背景并不是一个好主意,因为默认情况下ListView正在虚拟化(这很好),这意味着当滚动到视图外时,构成项目的控件将被处理掉。最简单的方法是,我可以想到在数据对象中有一个属性,表示New-state,然后就可以触发它。

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsNew}" Value="True">
                <Setter Property="Background" Value="Yellow"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListView.ItemContainerStyle>

如果您不再将其视为新值,则可以使用任何想要将该值设置为false的逻辑。