当使用包含组合框列的datatemplatecolumns加载数据网格时,我收到错误消息“递归调用Automation Peer API无效”。错误最终会被我们未处理的异常代码捕获。这似乎是我的机器上的一个问题,谷歌没有提供解决问题的指导来源。问题似乎只发生在我使用数据填充组合框时。填充组合框(如果我不加载数据)可以正常工作,并且在显示错误时,我能够在后台看到正确检索的数据。
我正在使用WPF数据网格,我正在使用DataGridTemplateColumn在网格中添加组合框。我使用objectdataprovider将下拉列表绑定到枚举。在初始化我的屏幕后面的代码中,我使用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>
对于解决这个问题的任何和所有指导都表示赞赏。
答案 0 :(得分:19)
我通过关闭网格控件上的自动化来绕过我的问题。我发现问题是WPF Toolkit控件所特有的,但我在转换到4.0官方发行版DataGrid时遇到了问题(与此问题无关。)
因此,我从WPFToolkit派生出类并提供此覆盖:
protected override AutomationPeer OnCreateAutomationPeer()
{
return null;
}
也许有人可以告诉我们这是不是一个好主意。
答案 1 :(得分:4)
我在使用WPFToolkit DataGrid的NET 3.5中遇到了同样的问题。
我已将WPFToolkit DataGrid绑定到EntityFramework ObservableCollection,其实体层次结构具有双向关联(Parent&lt; - &gt; Items)。
我通过在DataGrid上禁用隐式启用的AutoGenerateColumns并手动设置列来解决了这个问题。
希望这有帮助。
答案 2 :(得分:4)
我有完全相同的错误。然而对我来说奇怪的是,同样的应用程序在我的笔记本电脑上正常工作并导致我的台式PC出错。相同的操作系统,相同的体系结构和具有相同加载项的相同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并解决了问题。没有例外。希望这也会对某人有所帮助。
答案 3 :(得分:3)
我遇到了同样的问题 - 您使用的是WPFToolkit中的数据网格,还是.NET 4.0附带的数据网格。我们仍然在这里使用工具包。
另外,我注意到通过远程桌面使用应用程序时不会出现此问题。
此处发布的类似问题:
http://wpf.codeplex.com/workitem/14443
提出建议的解决方案。没有机会尝试。
答案 4 :(得分:2)
我也有同样的问题。所以我也检查了对WPFToolkit的引用。我安装了两个相同版本的WPFToolkit(版本v3.5.50211.1),但只在我的笔记本电脑上工作正常。
所以我将旧版 v3.5.40619.1 放在我的Windows Embedded Standard 7 PC上,不再有例外。
所以我得出结论,在某些情况下,较新的版本在运行系统中存在一些问题。
答案 5 :(得分:2)
Hi I also had same problem when I am running Microsoft Test Manager with our WPF application. We were using the WPFtoolkit version v3.5.50211.1, replacing WPF toolkit with lower version v3.5.40619.1 has solved this problem.
Now we are able to run the MTM tool and WPF application both simultaneously.
In WPFToolkit v3.5.50211.1 one bug is fixed related to UI Automation and I guess because of that this automation peer issue is coming while using the latest WPFtoolkit.
答案 6 :(得分:0)
通过将WPF XAML文件中的DataGrid和ComboBox替换为以下两个派生类,它们都覆盖了OnCreateAutomationPeer()方法,我能够解决此问题。
public class SafeDataGrid : DataGrid
{
protected override AutomationPeer OnCreateAutomationPeer()
{
return null;
}
}
public class SafeComboBox : ComboBox
{
protected override AutomationPeer OnCreateAutomationPeer()
{
return null;
}
}
答案 7 :(得分:0)
在较旧的解决方案上,我也遇到了同样的问题(尽管在本地开发计算机上可以正常工作,但在测试系统上却失败了(使用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.5.1->更新到.Net 4.7.1,这意味着PresentationFramework.dll的新版本,但WPFToolkit dll并未更改。
确定解决此问题的最佳方法是仅删除WPFToolkit.dll参考,并将所有DataGrid从Microsoft.Windows.Controls.DataGrid更新到较新的System.Windows.Controls.Datagrid。