2012-04-11 3 views
0

J'apprends WPF pour le moment. Je trouve xaml assez difficile à utiliser. J'ai MainWindow.xaml défini comme ceci:Affichage d'un contrôle basé sur le type de viewmoundel viewmodel?

<Window x:Class="Compliance.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary Source="MainWindow.Resources.xaml"></ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
    </Grid> 
</Window> 

Et MainWindow.Resources.xaml comme ceci:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:Compliance.ViewModel" 
    xmlns:vw="clr-namespace:Compliance.View"> 

    <DataTemplate DataType="{x:Type vm:Entities.AbstractEntityViewModel}"> 
     <vw:AbstractEntityView></vw:AbstractEntityView>  
    </DataTemplate>   
</ResourceDictionary> 

AbstractEntityView est comme ceci:

<UserControl x:Class="Compliance.View.AbstractEntityView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StackPanel> 
     <Label Content="ID:"></Label> 
     <TextBlock Text="{Binding Path=EntityId}"></TextBlock> 
    </StackPanel> 
</UserControl> 

Puis, en App.xaml.cs je suis impérieuses OnStartup comme ceci:

MainWindow window = new MainWindow(); 

    //Model class 
Individual ind = new Individual(1,"Name"); 

    //subclass of AbstractEntityViewModel 
var vm = new Entities.IndividualEntityViewModel(ind); 

window.DataContext = vm; 
window.Show(); 

Cependant, rien n'apparaît dans la fenêtre.

J'ai utilisé la réponse de this question pour obtenir mon contrôle à rendre. Cependant, cela vous oblige à vous référer aux éléments de la vue du code, ce que je ne veux pas faire.

Est-il possible d'obtenir une fenêtre pour choisir une vue à afficher en fonction de l'ensemble ViewModel en tant que son datacontext? Ou ai-je la mauvaise idée de la façon dont MVVM est censé fonctionner?

Répondre

1

Vous avez la bonne idée, mais vous ne dites pas réellement WPF pour afficher votre ViewModel partout

je serai l'hôte habituellement un ViewModel dans un objet ContentControl si je suis lier à un seul ViewModel

<Window x:Class="Compliance.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary Source="MainWindow.Resources.xaml"></ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <ContentControl Content="{Binding }" /> 
    </Grid> 
</Window> 

Le ContentControl n'est généralement pas nécessaire pour les listes Models ou ViewModels, puisque l'objet est automatiquement inséré en tant que propriété Content du ContentPresenter de chaque élément. Par exemple, aucun ContentControl est nécessaire lors de la liaison d'un ListBox à une collection de ViewModels

<ListBox ItemsSource="{Binding MyCollectionOfViewModel}" /> 
+0

Neat, merci. J'ai eu un problème bizarre avec while avec la ligne 'DataContext =" {Relative RelativeSource = {RelativeSource Self}} "' qui est apparu dans ma définition de fenêtre (je suis sûr que je ne l'ai pas mis là ...) mais tout travaillé une fois que j'ai enlevé cela. – Oliver

+0

@Oliver En vous référant à 'Self 'dans la liaison, vous définissez la source de liaison sur l'objet de l'interface utilisateur, et non sur' DataContext' – Rachel

Questions connexes