我正在开发一个 Windows 窗体 GUI,其设计模式是 MVP 和 MVVM 的组合。
我使用代码将视图绑定到视图模型:视图订阅 VM 的PropertyChanged
事件。如果表示器设置 VM 的某些属性,则会引发事件,并且视图将执行其回调。
所以视图中的每个回调都需要用this.Invoke( { ... } )
包装。
我希望有一种方法可以定义一个属性,其 setter 将在 UI 线程中自动调用。编写自动委派属性或方法的某种方法。
我也用 WPF 标记了这个问题,因为我使用的是 C# 4.0,所以如果 WPF 中存在这样的机制,我很乐意将其用于 Windows 窗体。
*我使用的是 MVVM,因为应用程序可能会在某个阶段转换为 WPF。
我突然意识到我正在使用的IoC框架Castle Windsor可以给我提供这一点。我刚刚将一个拦截器附加到表单的所有方法,拦截器是这样做的:
if (invocation.InvocationTarget.InvokeRequired)
{
invocation.InvocationTarget.Invoke(invocation.Proceed);
}
else
{
invocation.Proceed();
}
后来我修改了上面的代码,将其放入具有以下签名的扩展方法中:
public void InvokeIfRequired(this Control uiObject, Action action)
若要定义始终在 UI 线程上调用的属性资源库,可以执行以下操作:
public int MyPropertyForTheUIThread
{
get
{
return this.myRealValue;
}
set
{
if (this.myRealValue != value)
{
this.myRealValue = value;
this.Invoke((Action)(()=>
{
// The stuff I want to do on the UI thread when this property changes.
});
}
}
}