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

时间:2015-11-12 20:00:41

标签: wpf listview itemsource

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

所以在此之后,当我将文件添加到我的列表中时,没有任何事情发生。

1 个答案:

答案 0 :(得分:0)

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

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