WPF应用程序,C#,MVVM模式。
我的应用程序在网络上查看文件夹。当在该文件夹中创建文件时,我想解析文件中的数据并将解析后的信息存储在集合中。然后将原始文件移动到网络上的另一个文件夹。我的问题是我无法将解析后的文件从观看文件夹的线程移动到具有集合和UI的线程。我最近的尝试是尝试代表,但我不认为我有这个权利。
private ObservableCollection<TestFile> destinationFiles=new ObservableCollection<TestFile>();
public string DestinationFolder
{
get { return destinationFolder; }
set
{
if (destinationFolder != value)
{
destinationFolder = value;
UpdateFileList("Destination");
}
RaisePropertyChanged();
}
}
public MainWindowViewModel()
{
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.Changed += new FileSystemEventHandler(OnChanged);
}
public delegate void GetFileDelegate(string str);
public void OnCreated(object sender, FileSystemEventArgs e)
{
string name = e.FullPath;
GetFileDelegate del = new GetFileDelegate(GetFile);
Dispatcher.CurrentDispatcher.Invoke(del, name);
}
public void GetFile(string name)
{
TestFile tst = new TestFile(name);
FileName = name;
DestinationFiles.Add(tst); //Here is the exception!
}
mainwindowviewmodel设置FileSystemWatcher。用于选择文件夹的代码和所有这些代码都是为了简洁而省略的,但构造函数已完成,如图所示。
这一直到更新Collection:DestinationFiles.Add(tst)。这里抛出异常,试图从与Dispatcher线程不同的线程更新集合。
FileSystemWatcher没有后台工作者具有的“ReportProgress”方法。所以我无法通过它传回文件。我找到了一些“示例”,展示了如何从FileSystemWatcher更新UI。找不到比2012更新的。找到的那些不包括可编译的代码示例。其他人发现忽略了搜索字符串的WPF和MVVM部分。
答案 0 :(得分:1)
使用Application.Current.Dispatcher
代替Dispatcher.CurrentDispatcher
查看区别:Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher
答案 1 :(得分:0)
当您致电Dispatcher.CurrentDispatcher
时,您正在使用当前的工作线程。要在UI thread in WPF上拨打电话,您应该使用:
Application.Current.Dispatcher.Invoke(del, name);