我在Visual Studio 2015中構建了MVVM Light WPF應用程序。它具有一個用戶控件,其中包含WindowsFormsHost
和ReportViewer
,用於SQL Server Reporting Services本地報告。 ReportView.xaml
中的按鈕會調用一個命令,該命令會將消息發送到MasterListView.xaml
的代碼隱藏以生成報告。繁忙的指標不工作
下面是由按鈕稱爲命令在ReportViewModel.cs
:
public ICommand RunReportRelayCommand =>
new RelayCommand(async()=> { await RunReport(); });
private async Task RunReport()
{
try
{
IsBusy = true;
await Task.Run(() =>
{
Messenger.Default.Send(true, "RunMasterListReport");
});
}
finally
{
IsBusy = false;
}
}
下面是ReportViewModel.cs
的IsBusy
屬性的定義:
private bool _isBusy;
public bool IsBusy
{
get { return _isBusy; }
set
{
if (value == _isBusy) return;
_isBusy = value;
RaisePropertyChanged();
}
}
同樣的觀點,ReportView.xaml
,其包含按鈕調用上述命令還包含以下擴展WPF Toolkit忙指示符:
<UserControl>
<UserControl.Resources>
<DataTemplate x:Key="MasterListViewTemplate">
<view:MasterListView />
</DataTemplate>
</UserControl.Resources>
<xctk:BusyIndicator IsBusy="{Binding IsBusy}">
<StackPanel>
<!-- Other XAML here -->
<ContentControl ContentTemplate="{StaticResource MasterListViewTemplate}" />
</StackPanel>
</xctk:BusyIndicator>
</UserControl>
然後在MasterListView.cs
代碼背後,我們有這樣的:
public partial class MasterListView : UserControl
{
public MasterListView()
{
InitializeComponent();
Messenger.Default.Register<bool>(this, "RunMasterListReport", RunMasterListReport);
}
public async void RunMasterListReport(bool val)
{
await Task.Run(() =>
{
var dataSet = new DrugComplianceDataSet();
dataSet.BeginInit();
ReportViewer.ProcessingMode = ProcessingMode.Local;
ReportViewer.LocalReport.ShowDetailedSubreportMessages = true;
ReportViewer.LocalReport.DataSources.Clear();
var dataSource = new ReportDataSource
{
Name = "MasterListRandomDataSet",
Value = dataSet.MasterListRandom
};
ReportViewer.LocalReport.DataSources.Add(dataSource);
ReportViewer.LocalReport.ReportEmbeddedResource = "MasterListRandom.rdlc";
dataSet.EndInit();
var adapter = new MasterListRandomTableAdapter { ClearBeforeFill = true }
.Fill(dataSet.MasterListRandom);
Dispatcher.Invoke((MethodInvoker)(() => { ReportViewer.RefreshReport(); }));
});
}
}
然而,忙碌的指標不觸發,儘管報告沒有5秒打完顯示。我究竟做錯了什麼?謝謝。
這是因爲您只是在等待發送消息的動作,即「即時」......您的代碼不會等待消息接收觸發的任何事件。我會建議在異步RunReport方法中獲取數據,並將數據作爲有效負載發送或沿着這些行發送消息。在收到數據後,加載數據源。然後,等待應該像你期待的那樣行事。 –
謝謝,@MarkW。你介意在回答中闡述你的評論嗎? :) – Alex