c# - 如何在 WPF 中将集合绑定(bind)到 ListView

标签 c# .net wpf listview data-binding

我有一个程序可以在目录中搜索符合特定条件的文件。这个搜索过程需要时间,所以我不得不异步调用它。当搜索算法找到一个文件时,它会触发一个事件。我的MainWindow实例监听此事件并需要更新 GUI。如何将这些“添加的”文件绑定(bind)到 ListView ?我想我可以使用 ObservableCollection<FileInfo>实例,但我不知道如何绑定(bind)它。

我已经删除了所有不相关的控件和代码。这是两个相关文件。

主窗口.xaml:

<Window x:Class="Example.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CR Search" Height="395" Width="525">
    <Grid>
        <ListView x:Name="Results">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Filename"/>
                    <GridViewColumn Header="Directory"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

主窗口.xaml.cs:

using System.IO;
using System.Threading.Tasks;

public partial class MainWindow
{
    private SearchLogic _backgroundSearch;

    private async void Search(object sender, RoutedEventArgs e)
    {
        // TODO: clear Results

        _backgroundSearch = new SearchLogic("", new DirectoryInfo("C:\"));
        _backgroundSearch.FileAdded += FileAdded;

        await Task.Run(new Action(_backgroundSearch.Search));
    }

    private void FileAdded(object sender, FileAddedEventArgs eventArgs)
    {
        // TODO: add eventArgs.File to Results
        // eventArgs.File is an instance of FileInfo
    }
}

最佳答案

这是一个简单的例子

您的 XAML

<Window x:Class="WpfApplication10.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Width="525"
        Height="350"
        Loaded="Window_Loaded">
    <Grid>
        <ListBox ItemsSource="{Binding FileNames}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <Label>Name</Label>
                        <TextBlock Text="{Binding Name}"/>
                        <Label>Modified</Label>
                        <TextBlock Text="{Binding LastModified}"/>                        
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

您的代码隐藏

public partial class MainWindow : Window
{
    public class FileInfo
    {
        public string Name { get; set; }
        public DateTime LastModified { get; set; }
        public FileInfo(string name)
        {
            Name = name;
            LastModified = DateTime.Now;
        }
    }

    ObservableCollection<FileInfo> mFileNames = new ObservableCollection<FileInfo>();

    public ObservableCollection<FileInfo> FileNames
    {
        get
        {
            return mFileNames;
        }
    }

    public MainWindow()
    {
        DataContext = this;
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ThreadPool.QueueUserWorkItem((x) =>
            {
                while (true)
                {
                    Dispatcher.BeginInvoke((Action)(() =>
                    {
                        mFileNames.Add(new FileInfo("X"));
                    }));
                    Thread.Sleep(500);
                }
            });
    }
}

如果你运行这个问题,你会注意到列表框每半秒更新一次新项目。基本上要注意的关键是 ObservableCollection 只能从 UI 线程更新,所以如果你重构上面的代码,你需要以某种方式使用当前 UI 线程的 Dispatcher 来更新它

关于c# - 如何在 WPF 中将集合绑定(bind)到 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15747780/

相关文章:

c# - LINQ:添加 RowNumber 列

c# - 如何通过 WebRequest 调用 MVC 操作并通过 Active Directory 验证请求?

C#在可调整大小的图片中绘制点

c# - XmlReader 在 C# 中的工作原理

.net - 具有内置 Visual Studio 集成的 VS2010 和 .net v4 项目的良好混淆器

wpf - 在按钮上的xaml中缩放缩放转换(在控件模板中)以执行 “zoom”

c# - C# 2.0-3.0 是否支持方法的命名参数?

c# - Windows Form 在不阻塞 UI 的情况下运行外部进程

c# - 如何随机分配按钮内容和颜色?

c# - 为什么 ViewModelLocator 成员不是静态的