如何为WindowsFormHost托管的ReportViewer控件添加绑定

时间:2011-03-18 07:03:43

标签: wpf binding reportviewer

我在WPF应用程序中使用Microsoft的ReportViewer控件。由于这是一个WinForms组件,我使用WindowsFormHost控件。

我尝试遵循WPF Application Framework支持的MVVM模式,因此我实现了一个ReportViewModel,其中包含(当中)当前报告名称和数据集(两者都可以通过'常规选择) 'WPF控件,该部分工作正常。)

我希望尽可能地成为“WPF-ish”,那么如何正确设置与ReportViewer组件(在WindowsFormHost控件内)的绑定?每当视图模型报告名称或数据集发生更改时,我都需要设置ReportViewer.LocalReport.ReportEmbeddedResource属性并调用ReportViewer.LocalReport.DataSources.Add(可能还有Clear)。这样做的正确方法是什么?

有没有机会使用常规的WPF绑定机制之一?如果有,怎么样?如果不是,我将如何设置绑定? (这是我的第一个'真正的'WPF项目,所以不要羞于发布琐碎的解决方案:) ...)

谢谢!

1 个答案:

答案 0 :(得分:0)

到目前为止,我已经提出了以下解决方案(纯粹代码隐藏):

private void MyDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) {
  if (e.OldValue is ReportViewModel) {
    var viewModel = e.OldValue as ReportViewModel;
    viewModel.PropertyChanged -= ViewModelPropertyChanged;
  }
  if (DataContext is ReportViewModel) {
    var viewModel = DataContext as ReportViewModel;
    viewModel.PropertyChanged += ViewModelPropertyChanged;
    SetReportData();
  }
}

void ViewModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {
  if (e.PropertyName == "ReportName" || e.PropertyName == "ReportData") 
    SetReportData();
}

private void SetReportData() {
  var viewModel = DataContext as ReportViewModel;
  if (viewModel != null) {
    var reportView = reportHost.Child as ReportViewer;
    reportView.LocalReport.ReportEmbeddedResource = viewModel.ReportName;
    reportView.LocalReport.DataSources.Clear();
    reportView.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", viewModel.ReportData as DataTable));
    reportView.RefreshReport();
  }
}

我仍然很好奇是否有更好的解决方案(我确信有......)。