2010-04-20 5 views
0

J'ai une vue principale et de nombreux contrôles userc.comment changer de vue selon la commande

La vue principale contient une grille à deux colonnes, avec la première colonne remplie d'une zone de liste dont le datatemplate est constitué d'un contrôle userc et la seconde colonne d'un autre contrôle userc. Ces deux contrôles usuels ont le même contexte de données.

MainView:

<Grid> 
    //Column defs 
    ... 
    <ListView Grid.Column="0" ItemSource="{Binding FooList}"> 
     ... 
     <DataTemplate> 
      <Views: FooView1 /> 
     </DataTemplate> 
    </ListView> 
    <TextBlock Text="{Binding FooList.Count}" /> 
    <StackPanel Grid.Column="1"> 
     <Views: FooView2 /> 
    </StackPanel> 
<Grid> 

FooView1:

<UserControl> 
    <TextBlock Text="{Binding Foo.Title}"> 
</UserControl> 

FooView2:

<UserControl> 
    <TextBlock Text="{Binding Foo.Detail1}"> 
    <TextBlock Text="{Binding Foo.Detail2}"> 
    <TextBlock Text="{Binding Foo.Detail3}"> 
    <TextBlock Text="{Binding Foo.Detail4}"> 
</UserControl> 

Je n'ai pas d'IDE ici. Excusez-moi s'il y a une erreur de syntaxe

Lorsque l'utilisateur clique sur un bouton. Ces deux contrôles usés doivent être remplacés par deux autres contrôles usuels, de sorte que le datacontext change, l'interface utilisateur principale restant la même.

-à-dire, FooView1 par BarView1 et FooView2 par BarView2

En bref je veux lier cette vue des changements dans MainView à ma commande (commande de bouton)

Comment puis-je faire cela?

aussi me dire si je pouvais fusionner les paires de UserControl, de sorte que seule vue existe pour chaque viewmodel

-à-dire, FooView1 et FooView2 en FooView et ainsi de suite ...

Répondre

0

Désolé, mais je ne pas compris. Pour répondre à votre question, vous devez fournir plus d'informations.

  1. Voulez-vous changer votre datacontext en remplaçant un usercontrol?
  2. Pourquoi n'utilisez-vous pas des modèles de données différents pour différents types de cibles?
  3. Peut-être que vous pouvez fournir des extraits de code.
+0

vérifier ma mise à jour. code ajouté. – Amsakanna

1

Bien que je ne sache toujours pas si je vous ai, je suggère ce qui suit.

Dans votre exemple, il semble que vous souhaitez afficher les détails de l'objet Foo. Le datacontext reste le même. Peut-être que vous pouvez définir Visibility-Flags dans votre viewmodel pour décider de ce que vous voulez afficher. Cela peut être fait en utilisant la commande qui est exécutée par votre bouton.

FooView:

<UserControl> 
    <TextBlock Text="{Binding Foo.Title}" 
       Visibility="{Binding ShowTitle}"> 
    <TextBlock Text="{Binding Foo.Detail1}" 
       Visibility="{Binding ShowDetails}"> 
    <TextBlock Text="{Binding Foo.Detail2}" 
       Visibility="{Binding ShowDetails}"> 
    <TextBlock Text="{Binding Foo.Detail3}" 
       Visibility="{Binding ShowDetails}"> 
    <TextBlock Text="{Binding Foo.Detail4}" 
       Visibility="{Binding ShowDetails}"> 
</UserControl> 

Est-ce une solution?

Si vous voulez changer le DataTemplate que vous pourriez faire quelque chose comme ceci:

FooView (2ème version)

<UserControl> 
<UserControl.Resources> 
    <DataTemplate x:Key="dataTemplate1"> 
     <TextBlock Text="{Binding Foo.Title}"> 
    </DataTemplate> 
    <DataTemplate x:Key="dataTemplate2"> 
     <TextBlock Text="{Binding Foo.Detail1}"> 
     <TextBlock Text="{Binding Foo.Detail2}"> 
     <TextBlock Text="{Binding Foo.Detail3}"> 
     <TextBlock Text="{Binding Foo.Detail4}"> 
    </DataTemplate> 
</UserControl.Resources> 
    <Style x:Key="Default"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Foo.ShowFooView}" Value="1" > 
       <Setter Property="Template" Value="{StaticResource dataTemplate1}" /> 
      <DataTrigger> 
      <DataTrigger Binding="{Binding Data.ShowFooView}" Value="2" > 
       <Setter Property="Template" Foo="{StaticResource dataTemplate2}" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</UserControl> 

L'idée est que selon la propriété Foo.ShowFooView vous décidez quel modèle de données doit être utilisé. Bien sûr, le type Foo doit implémenter INotifyPropertyChanged pour notifier l'interface utilisateur.

+0

pas exactement, mais vous êtes sur mon chemin. Au lieu de définir la visibilité des éléments enfants, j'ai déjà implémenté ceci pour tout le UserControl (FooView2). Ma question est: "Y at-il un moyen de changer dynamiquement le datatemplate pour ListView (FooView1)?" – Amsakanna

+0

Ajouté FooView (2ème version) – Florian

+0

Awesome man !!! Ça devrait marcher :) – Amsakanna

Questions connexes