Рекурсивный вызов WPF к API-интерфейсу автоматизации недопустим

Я получаю сообщение об ошибке «Рекурсивный вызов API-интерфейса автоматизации недопустим» при загрузке сетки данных со столбцом шаблона данных, содержащим столбец со списком. Ошибка попадает в наш необработанный код исключения. Похоже, это проблема на моей машине, и Google не предоставил никаких рекомендаций по ее устранению. Проблема возникает только тогда, когда я заполняю поля со списком данными. Заполнение полей со списком (если я не загружаю данные) работает правильно, и, пока отображается ошибка, я могу видеть данные, правильно извлеченные в фоновом режиме.

Я использую сетку данных WPF, где я использую DataGridTemplateColumn для добавления поля со списком внутри сетки. У меня есть раскрывающийся список, привязанный к перечислению с помощью поставщика данных объекта. В коде позади при инициализации моего экрана я использую оператор Linq2Sql для извлечения данных и заполнения Itemssource сетки.

<grid:DataGrid.Resources>
 <ObjectDataProvider
  x:Key="ChangeTypeData"
  MethodName="GetValues"
  ObjectType="{x:Type System:Enum}">
  <ObjectDataProvider.MethodParameters>
   <x:Type TypeName="namespace:ChangeType" />
  </ObjectDataProvider.MethodParameters>
 </ObjectDataProvider>     
    </grid:DataGrid.Resources>

 <grid:DataGrid.Columns>
 <grid:DataGridTextColumn Binding="{Binding DatapointName}" Header="Datapoint Changed" IsReadOnly="True" Width="Auto" />
 <grid:DataGridTemplateColumn Header="Change Type">
  <grid:DataGridTemplateColumn.CellTemplate>
   <DataTemplate>
    <ComboBox
     Text="{Binding Path=ChangeTypeName}"
     ItemsSource="{Binding Source={StaticResource ChangeTypeData}}"
     Name="dgcboChangeType"
SelectionChanged="dgcboChangeType_SelectionChanged"/>
   </DataTemplate>
  </grid:DataGridTemplateColumn.CellTemplate>

Приветствуются любые рекомендации по решению этой проблемы.


person Ryan    schedule 25.10.2010    source источник
comment
Я столкнулся с той же проблемой, и проблема исчезла, когда я установил высоту DataGrid.   -  person Geert Immerzeel    schedule 07.02.2013


Ответы (8)


Я обошел проблему со своей стороны, отключив автоматизацию в управлении сетью. Я обнаружил, что проблема была уникальной для элемента управления WPF Toolkit, но у меня возникли проблемы с переходом на официальный выпуск 4.0 DataGrid (не связанный с этим вопросом).

Поэтому вместо этого я получаю класс от WPFToolkit и предоставляю это переопределение:

protected override AutomationPeer OnCreateAutomationPeer()
{
   return null;
}

Может быть, кто-нибудь подскажет, хорошая это идея или нет.

person cunningdave    schedule 03.11.2010
comment
Я могу подтвердить, что этот обходной путь помогает. Я заметил, что важно не включать часть Assembly=... в объявление пространства имен xml, если класс обходного пути находится в той же сборке, что и файл XAML (т. е. часть Assembly= в любом случае избыточна). Если он присутствует, компилятор будет жаловаться на отсутствие тега xml, хотя IntelliSense работает. - person lathander; 07.03.2011
comment
Я получаю ту же проблему, но ее нет в DataGrid, у меня есть Combobox внутри Grid, и иногда, когда я пытаюсь щелкнуть, чтобы выбрать другой элемент из списка, он ломается и выдает то же исключение, поэтому я предполагаю, что это поле со списком ` проблема, есть ли у кого-нибудь другое решение. - person Abdullah Malikyar; 23.05.2015
comment
Извините, что @FaisalMalikyar опоздал на год, но я только что нажал это для ComboBox. Решение кажется таким же - подкласс существующего ComboBox, например. общедоступный класс ComboBox : System.Windows.Controls.ComboBox, добавьте код, как указано выше, в новый класс, затем добавьте ссылку на свой класс в коде XAML, т. е. замените существующий ComboBox своим собственным. - person si618; 25.05.2016

У меня была точно такая же ошибка. Однако для меня было странным, что то же самое приложение отлично работало на моем ноутбуке и вызывало ошибку на моем настольном ПК. Та же ОС, та же архитектура и та же Visual Studio с теми же надстройками.

Поэтому я проверил ссылки на WPFToolkit на своем ноутбуке, где все было в порядке. Он указывал на:

C:\Program Files (x86)\WPF Toolkit\v3.5.40619.1\WPFToolkit.dll

затем я проверил ссылку на своем рабочем столе, она указала на:

C:\Program Files (x86)\WPF Toolkit\v3.5.50211.1\WPFToolkit.dll

Как видите, у меня были установлены две разные версии WPFToolkit. Я скопировал всю папку со своего ноутбука на рабочий стол, изменил ссылки с версии v3.5.50211.1 на v3.5.40619.1, и проблема была решена. Больше никаких исключений. Надеюсь, это тоже кому-то поможет.

person Protazy    schedule 08.04.2014

У меня была такая же проблема в NET 3.5 с WPFToolkit DataGrid.

Я привязал свой WPFToolkit DataGrid к EntityFramework ObservableCollection с иерархией сущностей, которые имеют двусторонние ассоциации (Parent‹-> Items).

Я решил проблему, отключив неявно включенные AutoGenerateColumns в DataGrid и установив столбцы вручную.

Надеюсь это поможет.

person surfen    schedule 29.11.2011

У меня та же проблема: вы используете сетку данных из WPFToolkit или ту, которая поставляется с .NET 4.0. Мы все еще используем набор инструментов здесь.

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

Аналогичная проблема написана здесь:

http://wpf.codeplex.com/workitem/14443

С предложенным решением. Не было возможности попробовать.

person cunningdave    schedule 02.11.2010
comment
Я использую WPFToolkit Datagrid. - person Ryan; 09.11.2010

У меня тоже была такая же проблема. Поэтому я также проверил ссылку на WPFToolkit. У меня были установлены две одинаковые версии WPFToolkit (версия v3.5.50211.1), но только на моем ноутбуке все работает нормально.

Поэтому я поставил старую версию v3.5.40619.1 на свой ПК с Windows Embedded Standard 7 и больше никаких исключений.

Итак, я пришел к выводу, что в некоторых случаях более новая версия имеет некоторые проблемы с операционной системой.

person Thomas    schedule 23.05.2014

Привет, у меня также была такая же проблема, когда я запускаю Microsoft Test Manager с нашим приложением WPF. Мы использовали версию WPFtoolkit v3.5.50211.1, замена набора инструментов WPF на более низкую версию v3.5.40619.1 решила эту проблему.

Теперь мы можем запускать инструмент MTM и приложение WPF одновременно.

В WPFToolkit v3.5.50211.1 исправлена ​​​​одна ошибка, связанная с автоматизацией пользовательского интерфейса, и я предполагаю, что из-за этого возникает проблема с одноранговым автоматом при использовании последней версии WPFtoolkit.

person Akhilesh Saini    schedule 29.10.2015

Мне удалось решить эту проблему, заменив DataGrid и ComboBox в XAML-файле WPF следующими двумя производными классами, которые переопределяют метод OnCreateAutomationPeer().

public class SafeDataGrid : DataGrid
{
    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return null;
    }
}

public class SafeComboBox : ComboBox
{
    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return null;
    }
}
person khavaali    schedule 31.05.2019

У меня была такая же проблема в более старом решении (хотя оно отлично работало на моем локальном компьютере разработчика, но не работало в тестовой системе (с WPFToolkit 3.5.50211.1)

Оказалось, что на моем локальном компьютере разработчика был более старый WPFToolkit: 3.5.40128.1.

Однако я еще немного проверил и понял, что проблема была только тогда, когда DataGrid был Microsoft.Windows.Controls.DataGrid (т.е. WPFToolkit), и он содержал элемент управления из пространства имен System.Windows.Controls (в этом случай ComboBox) - и из .Net PresentationFramework.dll)

Мы обновили решение до .Net 4.7.1 с .Net 4.5.1 ->, что означало бы новую версию PresentationFramework.dll, но dll WPFToolkit не изменилась.

Решил, что лучший способ исправить это — просто удалить ссылку на WPFToolkit.dll и обновить все DataGrid из Microsoft.Windows.Controls.DataGrid до более новой System.Windows.Controls.Datagrid.

person James S    schedule 09.08.2019