ViewModel ломает автоматизацию пользовательского интерфейса в WPF

У меня есть приложение WPF, которое в основном следует MVVM, которое я пытаюсь автоматизировать.

В некоторых моих пользовательских элементах управления я привязываю свойство Content к ViewModel другого пользовательского элемента управления. Существует определенный шаблон данных, который сопоставляет ViewModel с правильным представлением для отображения на экране.

Это прекрасно работает, когда приложение запускается пользователем, но если я пытаюсь просмотреть дерево автоматизации в UISpy или другом инструменте, оно всегда останавливается на ViewModel.

Я нашел эту проблему во многих местах. Есть ли способ сообщить ViewModel, чтобы отображать любые свойства автоматизации под ним в дереве? или я неправильно определяю шаблон данных?

Заранее спасибо, Донал

РЕДАКТИРОВАТЬ: Вот пример XAML, взятый из приложения. Он блокирует доступ к дереву автоматизации. Он помещается внутри RibbonWindow.

<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>

Below is a previous version of the above XAML. It was allowing access to the automation tree:

<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>

person Donal    schedule 05.10.2010    source источник
comment
Всегда полезно вставить XAML или код, когда вы спрашиваете, не ошибся ли что-то конкретное (в данном случае ваш DataTemplate).   -  person Wonko the Sane    schedule 05.10.2010


Ответы (1)


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

Во всяком случае, исправление было найдено в этом сообщении: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/fa8eb86f-5001-4af6-adb3-ceb0799a0cf3/

По сути, мы добавили 'Name="PART_SelectedContentHost"' в CachingContentPresenter в ControlTemplate. Насколько я понимаю, эта часть PART_ указывает синтаксическому анализатору/компилятору включить поведение шаблона элемента управления по умолчанию, такое как события мыши и нажатия клавиш, а также свойства автоматизации.

person Donal    schedule 07.10.2010