在数据对象加载周围设置IsBusy标志

时间:2011-11-16 23:29:36

标签: c# wpf

我们有一个相对较大的数据模型类DataModel,它绑定到各种UI控件。我们希望在加载数据模型实例时显示来自WPF Toolkit Extended的繁忙指示符。

示例代码如下。繁忙指示符在LoadReport函数执行时显示,但在assign语句后消失,而绑定操作仍处理,即在接口“就绪”之前。有什么我们可以做的等待吗?

// Show we are busy.
this.Dispatcher.Invoke(DispatcherPriority.Send, (Action)delegate()
{
    this.BusyMessage = "Loading report...";
    this.IsBusy = true;
});

var instance = this.LoadReport();
this.DataModel = instance;

// Show we are no longer busy.
this.Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate()
{
    this.BusyMessage = null;
    this.IsBusy = false;
});


<toolkit:BusyIndicator IsBusy="{Binding ThisScreen.IsBusy}" BusyContent="{Binding ThisScreen.BusyMessage, TargetNullValue='Please wait...'}" >
    <Grid x:Name="ScreenGrid" />
</toolkit:BusyIndicator>

这似乎不是一个不寻常的问题,但我没有任何运气寻找解决方案......提前致谢。

2 个答案:

答案 0 :(得分:0)

我说这是预期的行为。

BusyMessage方法完成后,您立即将IsBusy设置为空,将LoadReport()设置为false。这样就不会让UI的其余部分首先更新。

更好的解决方案可能是提出LoadComplete事件并添加

// Show we are no longer busy.
this.Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate()
{
    this.BusyMessage = null;
    this.IsBusy = false;
});

在处理程序中:

这将为其他绑定提供更新时间 - 尽管不能保证他们会首先解雇。

答案 1 :(得分:0)

也许您可以尝试设置BusyMessage&amp; IsBusy内联,而不是使用Dispatcher调用。

this.DataModel = instance;  

// set these directly
this.BusyMessage = null;     
this.IsBusy = false;

这会在发生DataModel绑定时通知UI你不会同时忙着 - 一切都会立即发生。

使用Dispatcher就像将通知直接推送到UI线程一样。您忙碌状态与您所做的其他绑定和UI更改“取消链接”。