ViewModel打破了WPF中的UI自动化

ViewModel打破了WPF中的UI自动化,wpf,automation,viewmodel,Wpf,Automation,Viewmodel,我有一个主要遵循MVVM的WPF应用程序,我正在尝试将其自动化 在我的一些用户控件中,我将Content属性绑定到另一个用户控件的ViewModel。定义了一个数据模板,将ViewModel映射到要在屏幕上显示的正确视图 当应用程序由用户运行时,这很好,但是如果我尝试在UISpy或其他工具中查看自动化树,它总是在ViewModel处停止 我在很多地方都发现了这个问题。有没有办法告诉ViewModel在树中公开其下的任何自动化属性?还是我定义的数据模板错误 提前感谢,, 多纳尔 编辑:以下是从应用

我有一个主要遵循MVVM的WPF应用程序,我正在尝试将其自动化

在我的一些用户控件中,我将Content属性绑定到另一个用户控件的ViewModel。定义了一个数据模板,将ViewModel映射到要在屏幕上显示的正确视图

当应用程序由用户运行时,这很好,但是如果我尝试在UISpy或其他工具中查看自动化树,它总是在ViewModel处停止

我在很多地方都发现了这个问题。有没有办法告诉ViewModel在树中公开其下的任何自动化属性?还是我定义的数据模板错误

提前感谢,, 多纳尔

编辑:以下是从应用程序中获取的XAML示例。它正在阻止访问自动化树。它被放置在一个带状窗口内

<TabControl Grid.Column="2" 
   cal:RegionManager.RegionName="{x:Static Regions:RegionNames.MainRegion}"  
   Name="tabControlMain" 
   SelectedValuePath="Name">
       <TabControl.Template>
          <ControlTemplate TargetType="TabControl">
              <Grid>
                <TabPanel IsItemsHost="True" Visibility="Hidden" />
                <Border BorderBrush="{DynamicResource BorderBrush}" Background="White" BorderThickness="1">
                    <framework:CachingContentPresenter 
                        ItemsSource="{Binding Items, ElementName=tabControlMain}" 
                        ContentTemplateSelector="{framework:MvvmTemplateSelector}"
                        ContentSource="SelectedContent" />
                </Border>
              </Grid>
          </ControlTemplate>
     </TabControl.Template>

下面是上述XAML的早期版本。它允许访问自动化树:

<TabControl 
     Grid.Column="2" 
     Padding="0" 
     cal:RegionManager.RegionName="{x:Static Regions:RegionNames.MainRegion}"  
     Name="tabControlMain" 
     TabStripPlacement="Bottom" 
     SelectedValuePath="Name" 
     ItemContainerStyle="{StaticResource TabItemStyle}">
</TabControl>

其中,TabItemStyle为:

<Style TargetType="{x:Type TabItem}" x:Key="TabItemStyle">
   <Setter Property="Template">
      <Setter.Value>
          <ControlTemplate TargetType="TabItem">
          </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

我设法找到了上面发布的XAML的解决方案。我不确定它是否在我们的应用程序中的所有情况下都有效,但我还没有正确地尝试它们

无论如何,在这篇文章中找到了修复程序:


基本上,我们在ControlTemplate中的CachingContentPresenter中添加了“Name=“PART\u SelectedContentHost””。据我所知,这一部分告诉解析器/编译器包含控件模板的默认行为,如鼠标事件和键盘按下以及自动化属性。

我设法找到了上述XAML的解决方案。我不确定它是否在我们的应用程序中的所有情况下都有效,但我还没有正确地尝试它们

无论如何,在这篇文章中找到了修复程序:


基本上,我们在ControlTemplate中的CachingContentPresenter中添加了“Name=“PART\u SelectedContentHost””。据我所知,这一部分告诉解析器/编译器包含控件模板的默认行为,如鼠标事件和键盘按下以及自动化属性。

当询问特定的错误时,粘贴XAML或代码总是很有帮助的(在本例中,是您的数据模板)。当询问某些特定内容是否错误时(在本例中,是您的数据模板),粘贴XAML或代码总是很有帮助的。