2017-06-12 8 views
0

Ce mon view.xaml:Comment définir le contexte de données pour le contrôle utilisateur avec prisme wpf?

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height=".5*"/> 
     <RowDefinition Height="0.5*"/> 
    </Grid.RowDefinitions> 

    <Grid Grid.Row="0" x:Name="grdFormSearch" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <local:StudentUserControl HorizontalAlignment="Stretch" Height="100" VerticalAlignment="Stretch"/> 
    </Grid> 
</Grid> 

Au-dessus j'ai ajouté un StudentUserControl dans view.xaml.

StudentUserControl.xaml.cs:

public partial class StudentUserControl : UserControl 
{ 
    public StudentUserControl(StudentViewModel ViewModel) 
    { 
     InitializeComponent(); 
     this.DataContext = ViewModel; 
    } 
} 

StudentViewModel.cs:

public StudentViewModel(IEventAggregator eventAggregator, IUnityContainer container) 
{ 
    _eventAggregator = eventAggregator; 
    _container = container; 
} 

Il jette une erreur en XAML, car il attend un constructeur parameterless! Comment régler le DataContext pour le UserControl? Quelle est la meilleure approche pour le faire?

+0

Alors essayez-vous que votre UserControl utilise un ViewModel différent de la vue sur laquelle il est hébergé? – Kelly

+0

D'où vient l'instance de 'StudentViewModel'? – grek40

+0

Il n'est pas nécessaire de définir explicitement le DataContext d'un UserControl. Il est généralement hérité de l'un des contrôles parents de l'arborescence XAML. – Clemens

Répondre

1

Supprimez le paramètre du constructeur de la vue:

public partial class StudentUserControl : UserControl 
{ 
    public StudentUserControl() 
    { 
     InitializeComponent(); 
    } 
} 

Il ne devrait pas être là si vous voulez être en mesure de créer une instance de la vue dans votre balisage XAML comme vous faites ici:

<local:StudentUserControl HorizontalAlignment="Stretch" Height="100" VerticalAlignment="Stretch"/> 

en outre, vous ne devez pas définir explicitement le DataContext de la vue dans le code-behind de toute façon. Le DataContext doit dans la plupart des cas être hérité de l'élément parent, c'est-à-dire view.xaml dans votre cas, et si vous définissez explicitement le DataContext dans le constructeur de la vue, vous cassez l'héritage.

Si la vue parent n'a pas DataContext pour une raison quelconque, vous pouvez utiliser le localisateur de modèle de vue de prisme pour créer un modèle de vue:

<UserControl x:Class="WpfApplication1.StudentUserControl" 
    ... 
    xmlns:prism="http://prismlibrary.com/" 
    prism:ViewModelLocator.AutoWireViewModel="True"> 

S'il vous plaît consulter le lien suivant pour plus d'informations à ce sujet: http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/

+0

Comme mon constructeur StudentViewModel a les paramètres IEventAggregator, IUnityContainer, IRegionManager, comment ces paramètres seront-ils résolus? – GANI

+0

Le localisateur de modèle de vue doit prendre soin de cela à condition que vous ayez correctement configuré Prism. – mm8

+0

vues séparées et viewModels dans différentes bibliothèques, dans ce cas viewModelLocator ne fonctionne pas? – GANI