Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 将项添加到ListView时激发的事件?_Wpf - Fatal编程技术网

Wpf 将项添加到ListView时激发的事件?

Wpf 将项添加到ListView时激发的事件?,wpf,Wpf,我有这个XAML: <ListView Name="NameListView" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="1"> <ListView.View> <GridView> <GridViewColumn>

我有这个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>


还有一个名为“名称”的
observateCollection
,绑定到我的代码隐藏中的ListView。当向集合中添加新名称时,我希望ListView更改新添加名称的背景色。我该怎么做呢

您可以在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);
        }
    }
然后在该事件中,您可以使用如下代码访问您的项目:

((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);
        }
    }

直接设置ListViewItem的背景不是一个好主意,因为默认情况下ListView是虚拟化的(这很好),这意味着组成项目的控件在滚动出视图时会被释放。最简单的方法是,我能想到的是,在数据对象中有一个指示新状态的属性,然后可以触发它

<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的逻辑。我已经为您修复了问题中的代码格式。请花一点时间阅读提问区右侧以及问题区正上方[?]的“如何设置格式”框。(在“提问”框下还显示了一个预览框,您可以在其中预览您的问题。)1。它不是一个列表框,而是一个ListView 2。这是背景而不是前景。我在两个控件的任何地方都看不到这样的事件。修改了上面的代码以使其更清楚。这也适用于任何ItemsControl(ListBox或ListView)。我很确定这不会奏效。首先,强制转换到ListItem永远不会起作用,因为ListItem是一个与ListBox或ListView无关的文档控件。是的,我的意思是ListBoxItem,但无论如何,它只需要是一个控件。上面的代码确实有效,我只是运行它来确保。我同意如果他打算使用MVVM,他应该将属性添加到他的ViewModel中。但是,如果他不想使用MVVM,那么这段代码就可以了,他不需要设置ViewModel和所有东西。我可以在我的项目中使用您的解决方案。我希望我们使用的是MVVM,但一切都是在控件的代码隐藏中完成的。