我在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项目,所以不要羞于发布琐碎的解决方案:) ...)
谢谢!
答案 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();
}
}
我仍然很好奇是否有更好的解决方案(我确信有......)。