Dans WPF, MVVM devrait-il être impliqué dans L'ouverture d'une fenêtre, par exemple, sur-Fenêtre?

j'ai une vue d'arbre standard de WPF et j'ai des articles reliés pour voir les classes de modèles.

je souhaite maintenant gérer le comportement lorsque les éléments sont double-cliqués (documents d'ouverture visual-studio-style).

je peux faire démarrer le gestionnaire d'événements dans le boîtier de commande du treeview (XAML montré), mais comment puis - je me lier à un comportement spécifique sur les classes de modèles de vue-par exemple ProjectViewModel?

préférable lié à ICommand-implémenter, car il s'agit utilisé ailleurs...

Merci pour tout commentaire,

Anders, Le Danemark

    <TreeView ItemsSource="{Binding Projects}" MouseDoubleClick="TreeView_MouseDoubleClick">
        <TreeView.ItemContainerStyle>
            <!-- 
    This Style binds a TreeViewItem to a TreeViewItemViewModel. 
    -->
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>

        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type Implementations:ProjectViewModel}" ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <Image Width="16" Height="16" Margin="3,0" Source="ImagesRegion.png" />
                    <TextBlock Text="{Binding DisplayName}" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type Implementations:PumpViewModel}" ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <Image Width="16" Height="16" Margin="3,0" Source="ImagesState.png" />
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <DataTemplate DataType="{x:Type Implementations:PumpDesignViewModel}">
                <StackPanel Orientation="Horizontal">
                    <Image Width="16" Height="16" Margin="3,0" Source="ImagesCity.png" />
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </DataTemplate>
        </TreeView.Resources>
    </TreeView>
2
demandé sur Anders Juul 2010-12-19 21:28:32

2 réponses

au titre-question: Oui. La VM de la vue principale devrait afficher L'AboutBox.

mais le corps du message semble différent, peut-être Pouvez-vous développer un peu?

2
répondu Henk Holterman 2010-12-19 21:36:58

la meilleure façon de faire ceci est d'utiliser la commande pattern comme vous l'avez déjà mentionné. C'est-à-dire: se lier à une implémentation D'ICommand via une propriété de dépendance.

Les propriétés de dépendance

sont en fait implémentées par une propriété de support statique qui implémente le truc de dépendance utilisé par le framework.

malheureusement, la façon dont MS a décidé de mettre en œuvre la propriété de soutien est - eh bien, pas optimal pour le moins.

il est relié à la propriété publique non-statique à laquelle vous vous liez dans xaml - au moyen d'une chaîne de caractères hardcoded...

Je ne me souviens pas où mais j'ai trouvé une solution très élégante à la relation Statique/non-statique qui utilise une expression lambda pour faire le mappage, éliminant ainsi complètement le mappage de chaîne à codage dur et sujet aux erreurs.

Si vous avez encore besoin je peux vous envoyer quelques infos sur cette. Vous savez où me joindre :-)

une autre préoccupation que vous devrez aborder est de faire abstraction de la mise en œuvre de la vue pour maintenir la testabilité.

0
répondu Torben Falck 2011-12-15 20:51:09