首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ListView在循环中删除时不会刷新

ListView在循环中删除时不会刷新
EN

Stack Overflow用户
提问于 2019-06-04 04:44:38
回答 1查看 0关注 0票数 0

我有一个ListView绑定到ObservableCollection。当我手动删除项目(每个按钮事件)时,项目将被删除,并ListView立即刷新。

当我删除for 循环中的项目时,在删除所有元素后,只有在操作结束时刷新列表。在删除项目之前,对它们进行一些耗时的操作,并在另一个项目中向用户发出通知ListView

那么如何才能实现,每次删除项目后列表都会刷新。

问题不是,如何从列表中删除循环中的项目,因为这可以工作(按相反的顺序)。问题是,为什么在删除项目时UI不会刷新。

这里我简化了示例代码,它显示了这种行为:

XAML

代码语言:javascript
复制
<Window x:Class="ListViewTest.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:ListViewTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>

        <ListView ItemsSource="{Binding LstFiles}" Grid.Column="0" Grid.Row="0"/>
        <Button Content="Los" Name="losBtn" Click="losBtn_Click" Grid.Column="0" Grid.Row="1" />
        <Button Content="del" Name="delBtn" Click="delBtn_Click" Grid.Column="0" Grid.Row="2" />
    </Grid>
</Window>

C#落后

代码语言:javascript
复制
using System.Collections.ObjectModel;
using System.Windows;

namespace ListViewTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<string> LstFiles { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            LstFiles = new ObservableCollection<string>();

            for (int i = 0; i < 20; i++)
            {
                LstFiles.Add(string.Format("file_{0}", i));
            }

            DataContext = this;
        }

        private  void losBtn_Click(object sender, RoutedEventArgs e)
        {

            for (int i = LstFiles.Count - 1; i >= 0; i--)
            {
                LstFiles.RemoveAt(i);
                System.Threading.Thread.Sleep(50);
            }   
        }

        private void delBtn_Click(object sender, RoutedEventArgs e)
        {
            LstFiles.RemoveAt(0);
        }
    }
}

睡眠用于模拟耗时的操作。

EN

回答 1

Stack Overflow用户

发布于 2019-06-04 13:57:34

为什么在删除项目时ui没有刷新

这是因为您正在调用Thread.Sleep(),它只是阻止UI线程。您绝不能在UI应用程序中调用它。

虽然不清楚为什么你想要这个“删除循环”(而不是仅仅清除ObservableCollection),你可以Task.Delay()asyncClick处理程序方法中使用而不是Sleep :

代码语言:javascript
复制
private async void losBtn_Click(object sender, RoutedEventArgs e)
{
    for (int i = LstFiles.Count - 1; i >= 0; i--)
    {
        LstFiles.RemoveAt(i);
        await Task.Delay(50);
    }   
}

如果不是简单的延迟而是要调用一些耗时的操作,您可以简单地将其包装在一个Task.Run调用中:

代码语言:javascript
复制
private async void losBtn_Click(object sender, RoutedEventArgs e)
{
    for (int i = LstFiles.Count - 1; i >= 0; i--)
    {
        LstFiles.RemoveAt(i);
        await Task.Run(() =>
        {
            // some long running operation
        });
    }   
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档