2010-09-24 7 views
1

dans ma fenêtre j'ai vue sur l'arbre et un bloc de texte. L'arborescence est liée à un modèle de vue. les nœuds d'arbre sont liés à un autre modèle de vue. le modèle de vue arborescente fournit une liste de nœuds d'arborescence de niveau supérieur et le modèle de vue pour les nœuds d'arborescence fournit la liste des nœuds de nœud. il n'y a pas de notion du nœud actuellement sélectionné dans l'arborescence dans mes modèles de vue.comment mettre à jour un contrôle utilisateur lorsque l'événement se produit dans un autre contrôle utilisateur?

dans le bloc de texte je souhaite afficher la valeur d'une propriété connue du modèle de vue du nœud d'arbre actuellement sélectionné.

ma question est comment est-ce fait la bonne façon MVVM? Je préférerais le faire en XAML. devrais-je ajouter la propriété au modèle de vue arborescente pour le nœud actuellement sélectionné, puis lier simplement le bloc de texte à cette propriété? si oui, comment communiquerais-je au modèle de vue arborescente le fait que l'arborescence ait changé son nœud actuel?

ou est-ce que je peux le faire différemment? je ne sais pas comment ...

EDIT: permettez-moi de reformuler la question: comment définir le texte dans le bloc de texte à la propriété Name du modèle de vue correspondant à l'élément sélectionné lorsque la propriété IsSelected du modèle de vue devient vraie ?

Répondre

1

Il suffit de se lier à la SelectedItem sur l'élément TreeView lui-même. Voici un exemple assez simple qui utilise un XmlDataProvider. Le DataTemplate sur le ContentPresenter est l'endroit où la magie se produit:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
    <XmlDataProvider x:Key="Data" XPath="Tree"> 
     <x:XData> 
     <Tree xmlns="" Text="Test"> 
      <Node Text="Weapon"> 
      <Node Text="Sword"> 
       <Node Text="Longsword"/> 
       <Node Text="Falchion"/> 
       <Node Text="Claymore"/> 
      </Node> 
      <Node Text="Polearm"> 
       <Node Text="Halberd"/> 
       <Node Text="Pike"/> 
      </Node> 
      </Node> 
      <Node Text="Armor"> 
      <Node Text="Cloth Armor"/> 
      <Node Text="Leather Armor"/> 
      <Node Text="Ring Mail"/> 
      <Node Text="Plate Mail"/> 
      </Node> 
      <Node Text="Shield"> 
      <Node Text="Buckler"/> 
      <Node Text="Tower Shield"/> 
      </Node> 
     </Tree> 
     </x:XData> 
    </XmlDataProvider> 
    <HierarchicalDataTemplate x:Key="NodeTemplate" ItemsSource="{Binding XPath=Node}"> 
     <TextBlock Text="{Binding [email protected]}"/> 
    </HierarchicalDataTemplate> 
    </Page.Resources> 
    <DockPanel> 
    <TreeView 
     x:Name="Objects" 
     ItemsSource="{Binding Source={StaticResource Data}, XPath=Node}" 
     ItemTemplate="{StaticResource NodeTemplate}"/> 
    <ContentPresenter Content="{Binding ElementName=Objects, Path=SelectedItem}"> 
     <ContentPresenter.ContentTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding [email protected]}"/> 
     </DataTemplate> 
     </ContentPresenter.ContentTemplate> 
    </ContentPresenter> 
    </DockPanel> 
</Page> 
Questions connexes