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