0

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

来自主表单类的声明:

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

所以在这一点之后,当我将文件添加到我的列表中时,什么都没有发生。

4

1 回答 1

0

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

public partial class MainWindow : Window
{
    public ObservableCollection<MyData> Files { get; private set; }
于 2015-11-13T08:52:20.463 回答