Как добавить привязки для размещенного в WindowsFormHost элемента управления ReportViewer - PullRequest
0 голосов
/ 18 марта 2011

Я использую элемент управления ReportViewer от Microsoft в своем приложении WPF. Поскольку это компонент WinForms, я использую элемент управления WindowsFormHost.

Я пытаюсь следовать шаблону MVVM, поддерживаемому WPF Application Framework , поэтому я реализовал ReportViewModel, который содержит (помимо прочего) имя текущего отчета и набор данных (оба могут быть выбраны с помощью «обычные» элементы управления WPF, эта часть работает нормально).

Я бы хотел быть как можно более "WPF-иш", так как бы мне правильно настроить привязку к компоненту ReportViewer (который находится внутри элемента управления WindowsFormHost)? Мне нужно установить свойство ReportViewer.LocalReport.ReportEmbeddedResource и вызывать ReportViewer.LocalReport.DataSources.Add (и, возможно, Clear) всякий раз, когда в моделях представления сообщается об изменении имени или набора данных. Какой правильный способ сделать это?

Есть ли шанс использовать для этого один из обычных механизмов связывания WPF? Если да, то как? Если нет, как бы я настроил привязку? (это мой первый «настоящий» проект WPF, так что не стесняйтесь публиковать тривиальные решения :) ...)

Спасибо!

1 Ответ

0 голосов
/ 18 марта 2011

До сих пор я придумал следующее решение (чисто кодовый код):

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();
  }
}

Мне все еще интересно, есть ли более лучшие решения (я уверен, что есть ...).

...