又读了一些您的意见后,我想我有一个更好的了解情况的。这是你需要做的。
首先,确保您的某个ViewModel具有对需要打开和关闭窗口的Model的引用。一种实现方法是构造函数依赖注入。
public ViewModel(Model model) // or IModel
{
...
接下来,您需要捕获该视图模型中的UI调度器。这个最好的地方也许是ViewModel构造函数。
private Dispatcher dispatcher;
public ViewModel(Model model)
{
dispatcher = Dispatcher.CurrentDispatcher;
...
现在在您的模型中创建两个事件;一个打开,一个关闭窗口。
class Model
{
internal event Action OpenWindow = delegate { };
internal event Action CloseWindow = delegate { };
...
并在您的ViewModel构造函数中订阅它们。
public ViewModel(Model model)
{
dispatcher = Dispatcher.CurrentDispatcher;
model.OpenWindow += OnWindowOpen;
model.CloseWindow += OnWindowClose;
...
}
现在用ViewModel类中的UI Dispatcher打开和关闭窗口;
private Window window;
private void OnWindowOpen()
{
// still on background thread here
dispatcher.BeginInvoke(new ThreadStart(() =>
{
// now we're on the UI thread
window = new Window();
window.Show();
}
}
private void OnWindowClose()
{
dispatcher.BeginInvoke(new ThreadStart(() =>
{
window.Close();
}
}
最后,从您的模型中的后台线程中引发OpenWindow和CloseWindow事件,就像引发任何事件一样。你的模型可能看起来像这样:
class Model
{
private Thread worker;
internal event Action OpenWindow = delegate { };
internal event Action CloseWindow = delegate { };
public Model()
{
worker = new Thread(Work);
worker.Start();
}
private void Work()
{
while(true)
{
if (/*whatever*/) OpenWindow();
else if (/*whatever*/) CloseWindow();
}
}
}
为什么它必须作为UI线程运行?如果只是创建一个昂贵的对象,您可以在背景上创建对象,然后将其绑定在主要对象(易于关闭的位置)。 – Paparazzi 2011-12-19 22:37:22
它不创建对象。它正在创建另一个WPF窗口 – katie77 2011-12-20 00:14:09
您的问题陈述是“后台线程与数据库交谈”。如果你没有创建一个对象与数据库交谈,那么你在做什么与数据库? – Paparazzi 2011-12-20 02:34:44