2010-12-05 5 views
3

Mon application WPF a une MainWindow contenant un contrôle utilisateur appelé TvshowGridView.MVVM: Liaison d'un ViewModel qui prend les arguments du constructeur à un UserControl

MainWindow:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:NevermissClient" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:views="clr-namespace:NevermissClient.Views" 
    x:Class="NevermissClient.MainWindow" 
    x:Name="Window"> 
    <Grid x:Name="LayoutRoot"> 
     <views:TvshowGridView x:Name="TheTvshowGridView" Margin="8,8,8,58.96" Grid.Row="1"/> 
    </Grid> 
</Window> 

TvshowGridView:

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:viewModels="clr-namespace:NevermissClient.ViewModels" 
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    mc:Ignorable="d" 
    x:Class="NevermissClient.Views.TvshowGridView" 
    d:DesignWidth="640" d:DesignHeight="480"> 

    <Grid x:Name="LayoutRoot"> 

     <telerik:RadGridView x:Name="TvshowGrid" d:LayoutOverrides="Width, Height" AutoGenerateColumns="False" ItemsSource="{Binding AllEpisodes}" IsReadOnly="False"> 
      <telerik:RadGridView.Columns> 
       <telerik:GridViewDataColumn DataMemberBinding="{Binding TvshowName, Mode=TwoWay}" Header="Tvshow Name" IsReadOnly="False"/> 
       <telerik:GridViewDataColumn DataMemberBinding="{Binding Name, Mode=TwoWay}" Header="Episode Name"/> 

       <telerik:GridViewDataColumn DataMemberBinding="{Binding Airdate, Mode=TwoWay}" Header="Airdate"/> 
      </telerik:RadGridView.Columns> 
     </telerik:RadGridView> 

    </Grid> 
</UserControl> 

Le modèle de vue, TvshowGridViewModel, que je veux lier au TvshowGridView a un constructeur qui prend des arguments. Ces arguments sont définis dans MainWindowViewModel, le modèle de vue connecté à MainWindow. Ces paramètres sont définis dans MainWindowViewModel. - Cela semble donc être l'endroit logique pour créer le TvshowGridViewModel.

public class MainWindowViewModel : BaseViewModel 
{ 
    readonly TvshowGridViewModel _tvshowGridViewModel; 
    readonly EpisodeRepository _episodeRepository; 
    readonly TvshowRepository _tvshowRepository; 

    public MainWindowViewModel() 
    { 
     _episodeRepository = new EpisodeRepository("c:\data.xml"); 
     _tvshowRepository = new TvshowRepository("c:\data.xml"); 

     _tvshowGridViewModel = new TvshowGridViewModel(_episodeRepository, _tvshowRepository); 
    } 

    public TvshowGridViewModel TvshowGridViewModel { get; } 
    ... 
} 

Comment puis-je lier le TvshowGridViewModel instancié à la TvshowGridView? (Éviter le codebehind)

Merci!

Répondre

3

Si l'on suppose que votre MainWindows DataContext est une instance de MainWindowViewModel, vous pouvez lier le usercontrol à TvshowGridViewModel comme ceci:

<Window> 
... 
<Grid x:Name="LayoutRoot"> 
    <views:TvshowGridView DataContext={Binding TvshowGridViewModel} x:Name="TheTvshowGridView" Margin="8,8,8,58.96" Grid.Row="1"/> 
</Grid> 

Vous devez également modifier le code de la propriété TvshowGridViewModel comme indiqué:

public TvshowGridViewModel TvshowGridViewModel 
{ get{return _tvshowGridViewModel;} } 
+0

Ce travaillé comme un charme, merci! – Lefty

+1

Juste un indice important: Un ViewModel avec un constructeur ne peut PAS être datatemplated! Vous obtiendrez une exception bien sûr, que pourrait-il passer? Il y a des façons pensées en dehors de la valeur par défaut en utilisant un ViewModelLocator comme MEFedMVVM. – msfanboy

Questions connexes