0

У меня есть приложение WPF, в котором используются инструменты для отчетов, включенные в Visual Studio 2010. У меня были некоторые другие проблемы, которые я решил, создав граф объектов, которые все обозначены как сериализуемые и т. д., как указано на других веб-страницах.Обработчик события SubreportProcessing не может получить доступ к моей модели просмотра из-за того, что был на другом потоке

Элемент управления ReportViewer содержится в файле WindowsFormsHost. Я обрабатываю событие SubreportProcessing объекта ReportViewer.LocalReport, чтобы предоставить данные для дополнительного отчета.

График объектов, о которых я сообщаю, генерируется в моей модели просмотра, и эта модель просмотра содержит ссылку на нее. Обработчик SubreportProcessing находится в моем коде за моим окном (возможно, это не лучшее место, но я просто хочу, чтобы ReportViewer работал на этом этапе).

Вот проблема: В моем обработчике события, я пытаюсь получить ссылку на мой ViewModel используя следующий код:

var vm = DataContext as FailedAssemblyReportViewModel; 

При вызове обработчика, эта линия выбрасывает InvalidOperationException с сообщением The calling thread cannot access this object because a different thread owns it.

Я не знал, что обработчик может быть вызван в другой теме. Как я могу это решить?

Я попытался несколько поисков, но все, что я придумал в отношении обновления пользовательского интерфейса из другого потока с помощью Диспетчера, но это не будет работать в этом случае ...

ответ

0

Я решил эту проблему проблема используя что-то я верю, хак, добавив следующую функцию:

public object GetDataContext() { 
    return DataContext; 
} 

А затем заменить строку кода из моего вопроса с:

object dc = Dispatcher.Invoke(new Func<object>(GetDataContext), null); 
var vm = dc as FailedAssemblyReportViewModel; 

Однако это себе ems как хак, и я мог бы обойти какую-то проверку безопасности, которую делает CLR. Пожалуйста, дайте мне знать, если это неправильный способ выполнить это.

0

Это неприятная проблема, которая у вас там есть. Почему вы не используете в представлении контент-презентатора, который вы связываете с хостом Windows Form? И в модели представления у вас будет свойство типа типа WindowsFormsHost. Кроме того, в конструкторе модели представления вы можете установить свойство дочернего объекта формы окна с помощью средства просмотра отчетов. После этого плавное плавание, вы можете использовать средство просмотра отчетов в любом месте вашего кода. Что-то вроде этого: Вид:

<ContentPresenter Content="{Binding Path=FormHost}"/>       

ViewModel:

private ReportViewer report = new ReportViewer(); 
private WindowsFormsHost host = new WindowsFormsHost(); 
public WindowsFormsHost FormHost 
{ 
get {return this.host;} 
set 
    { 
     if(this.host!=value) 
     { 
     this.host = value; 
     OnPropertyChanged("FormHost"); 
     } 
    } 
} 


public ViewModel() //constructor 
{ 
    this.host.Child = this.report; 
} 

После этого счастливым кодирования. Надеюсь, поможет.

+0

Я не думаю, что как я представляю ReportViewer, это будет иметь какое-либо отношение к этому - ReportViewer вызывает обработчик событий из другого потока и будет делать это независимо от того, как элемент управления сделал это в окне. – Steve

+0

Я не понимаю, что вы говорили. Я пытался предоставить вам альтернативу, которая больше MVVM, чем кажется, что вы реализовали. В любом случае, рад, что вы смогли решить вашу проблему. – darkArk

+0

Спасибо за подсказку для подзапроса :) – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^