因此,假设在MVVM环境中,我在后台线程中,我想在ui控件上运行更新。所以通常我会使用myButton.Dispatcher.BeginInvoke(blabla),但是我不能访问myButton (因为视图模型不能访问视图的控件)。那么这样做的正常模式是什么呢?
(我想总是有绑定的,但我想知道如何通过dispatcher来实现)
发布于 2011-01-07 09:43:23
我通常使用Application.Current.Dispatcher
:因为Application.Current
是静态的,所以不需要引用控件
发布于 2011-01-07 09:10:29
来自Caliburn Micro源代码:
public static class Execute
{
private static Action<System.Action> executor = action => action();
/// <summary>
/// Initializes the framework using the current dispatcher.
/// </summary>
public static void InitializeWithDispatcher()
{
#if SILVERLIGHT
var dispatcher = Deployment.Current.Dispatcher;
#else
var dispatcher = Dispatcher.CurrentDispatcher;
#endif
executor = action =>{
if(dispatcher.CheckAccess())
action();
else dispatcher.BeginInvoke(action);
};
}
/// <summary>
/// Executes the action on the UI thread.
/// </summary>
/// <param name="action">The action to execute.</param>
public static void OnUIThread(this System.Action action)
{
executor(action);
}
}
在使用它之前,您必须从UI线程调用Execute.InitializeWithDispatcher()
,然后才能像这样使用Execute.OnUIThread(()=>SomeMethod())
发布于 2011-01-13 17:13:32
Catel的ViewModelBase有一个可以使用的Dispatcher属性。
https://stackoverflow.com/questions/4621623
复制相似问题