使用 class 中的项目源填充我的 ListView

Populate my ListView with item source from class

我有这个 Singleton 作为会员持有我的 ObservableCollection<MyData>:

public sealed class Singleton
{
    private static volatile Singleton instance;
    private static object syncRoot = new Object();

    public ObservableCollection<MyData> Files { get; private set; }

    private Singleton()
    {
        Files = new ObservableCollection<MyData>();
    }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                        instance = new Singleton();
                }
            }

            return instance;
        }
    }
}

来自主窗体的声明 class:

ObservableCollection<MyData> Files;

在构造函数之后:

Files= Singleton.Instance.Files;

XAML:

<ListView ItemsSource="{Binding Files}" />

现在当用户选择文件时我要检查每个文件:

private static void Check(IEnumerable<string> files)
{
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    CancellationToken token = tokenSource.Token;
    Task task = Task.Factory.StartNew(() =>
    {
        try
        {
            Parallel.ForEach(files,
            new ParallelOptions
            {
                MaxDegreeOfParallelism = 1
            },
        file =>
        {
            ProcessFile(file);
        });
        }
        catch (Exception)
        { }

    }, tokenSource.Token,
       TaskCreationOptions.None,
       TaskScheduler.Default).ContinueWith
        (t =>
        {

        }
, TaskScheduler.FromCurrentSynchronizationContext()
);
}

并且:

private static void ProcessFile(string file)
{
    // Lets assume that i want to add this file into my `ListView`
    MyData data = new .....
    Singleton.Instance.Files.Add(data);
}

所以在我将文件添加到我的列表中之后,没有任何反应。

使用您上面的代码,我能够重现您描述的问题。 问题是 WPF 无法绑定到字段,请参阅此 question 了解更多详细信息。您需要做的就是将主表单后面的代码中的 ObservableCollection<MyData> 更改为 属性 而不是字段。

public partial class MainWindow : Window
{
    public ObservableCollection<MyData> Files { get; private set; }