所以..我有WPF和MVVM模式。 ViewModel中的一个线程正在运行一个更新可观察集合的任务,所以当它添加到集合时我会这样做:
Application.Current.Dispatcher.Invoke((Action) (() =>
{
_files.Add(toAdd);
}));
哪个有效...问题是当我有NUnit测试并且没有我理解的UI线程时,所以我必须首先运行它以将文件添加到集合而不需要调用:
if (Application.Current == null) {
_files.Add(toAdd);
}));
所以只是为了澄清它的外观
if (Application.Current == null) {
_files.Add(toAdd);
return;
}));
Application.Current.Dispatcher.Invoke((Action) (() =>
{
_files.Add(toAdd);
}));
这感觉不对,因为我在viewmodel中添加了两行逻辑,一行有UI,另一行纯粹用于测试。
任何人都可以了解我的方法出错的地方,或者这是否真的可以接受?
由于
答案 0 :(得分:1)
我的ViewModel在其构造函数中需要一个IUIThreadHelper。
public MyViewModel(IUIThreadHelper uiThreadHelper)
{
if (uiThreadHelper == null)
throw new ArgumentNullException(nameof(uiThreadHelper));
this.uiThreadHelper = uiThreadHelper;
}
IUIThreadHelper看起来像:
public interface IUIThreadHelper
{
void InvokeAction(Action action);
}
在正常运行时,我给它一个使用应用程序调度程序的UIThreadHelper。
在测试中,我给它一个简单的假货:
IUIThreadHelper uiThreadHelper = new Fakes.StubIUIThreadHelper()
{
InvokeActionAction = (a) => a(),
};
所以我可以简单地使用它:
this.uiThreadHelper.InvokeAction(() => header.Children.Add(newChild));