gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:05:18 25 4
gpt4 key购买 nike

我有一个程序可以在目录中搜索符合特定条件的文件。这个搜索过程需要时间,所以我不得不异步调用它。当搜索算法找到一个文件时,它会触发一个事件。我的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com