2010-10-05 18 views
1

J'ai une application WPF qui suit principalement MVVM, que j'essaie d'automatiser.ViewModel casse l'automatisation de l'interface utilisateur dans WPF

Dans certains de mes contrôles utilisateur, je lie la propriété Content au ViewModel d'un autre contrôle utilisateur. Un modèle de données est défini qui mappe le ViewModel sur la vue correcte à afficher à l'écran.

Cela fonctionne correctement lorsque l'application est exécutée par un utilisateur, mais si j'essaie d'afficher l'arborescence d'automatisation dans UISpy ou un autre outil, il s'arrête toujours à ViewModel.

J'ai trouvé ce problème à plusieurs endroits. Existe-t-il un moyen de dire au ViewModel d'exposer les propriétés d'automatisation sous-jacentes dans l'arborescence? ou est-ce que je définis le mauvais modèle de données?

Merci à l'avance, Donal

EDIT: Voici un exemple XAML tiré de l'application. Il bloque l'accès à l'arbre d'automatisation. Il est placé dans un 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> 

Voici une version précédente du XAML ci-dessus. Il permettait l'accès à l'arbre d'automatisation:

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

Lorsque le TabItemStyle est:

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

Il est toujours utile de coller du code XAML ou du code lorsque vous demandez si quelque chose de spécifique est incorrect (dans ce cas, votre DataTemplate). –

Répondre

1

J'ai réussi à trouver une solution au XAML affiché ci-dessus. Je ne suis pas sûr que cela fonctionnera dans tous les cas dans notre application, mais je dois encore les essayer correctement.

Quoi qu'il en soit, le correctif a été trouvé dans ce post: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/fa8eb86f-5001-4af6-adb3-ceb0799a0cf3/

Fondamentalement, nous avons ajouté 'Name = "PART_SelectedContentHost"' au CachingContentPresenter dans le ControlTemplate. D'après ce que je comprends, ce PART_ dit à l'analyseur/compilateur d'inclure le comportement par défaut du modèle de contrôle tels que les événements de la souris et les pressions du clavier ainsi que les propriétés Automation.

+0

a travaillé pour moi merci! – Idan