2010-10-19 6 views
0

J'utilise la structure MVVM pour notre application. J'ai ajouté la vue en tant que modèle de données à une grille (Developer Express DXGrid).Utilisation d'une vue en tant que gabarit de données

<DataTemplate x:Key="cardTemplate"> 
    <ui:MediaEnquiryParticipantView x:Name="mediaEnquiryParticipantView"/> 
</DataTemplate> 

Maintenant, mon problème est que je veux que View (MediaEnquiryParticipantView) pour représenter 1 ligne d'une table.

Comment aborder mon problème?


<dxg:GridControl Name="grdParticipants" 
        Grid.Row="0" 
        Height="Auto" Width="Auto" 
        MaxHeight="5000" 
        VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
        AutoPopulateColumns="True" 
        DataSource="{Binding Path=MediaEnquiryParticipantList,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
        MouseDoubleClick="grdParticipants_MouseDoubleClick"> 
      <dxg:GridControl.Resources> 
       <DataTemplate x:Key="headerTemplateFullName"> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Path=Data.caUser.UserName}" /> 
        </StackPanel> 
       </DataTemplate> 
       <DataTemplate x:Key="cardTemplate"> 
        <ui:MediaEnquiryParticipantView x:Name="mediaEnquiryParticipantView" MediaEnquiryID="{Binding Path=Data.MediaEnquiryID}"/> 
       </DataTemplate> 
      </dxg:GridControl.Resources> 
      <dxg:GridControl.Columns> 
       <dxg:GridColumn FieldName="UserName" Width="150" AllowColumnFiltering="False"/> 
       <dxg:GridColumn FieldName="CanResolve" Width="150" AllowColumnFiltering="False"/> 
      </dxg:GridControl.Columns> 
      <dxg:GridControl.View> 
       <dxg:CardView x:Name="cardView"         
           CardHeaderTemplate="{DynamicResource headerTemplateFullName}" 
           CardTemplate="{DynamicResource cardTemplate}"> 
        <dxg:CardView.RowCellMenuCustomizations> 
         <dxb:BarButtonItemLink BarItemName="btnDelete" /> 
        </dxg:CardView.RowCellMenuCustomizations> 
       </dxg:CardView> 
      </dxg:GridControl.View> 
     </dxg:GridControl> 

La grille ci-dessus affiche "MediaEnquiryParticipantView" sous une forme Vignettes. La grille dans une partie de "MediaEnquiryParticipantsView" J'ai des modèles de vue séparés pour chacun.

Mon code pour MediaEnquiryParticipantViewModel:

public class MediaEnquiryParticipantViewModel : ViewModelBase 
{ 
    #region Fields 

    private IQueryable<caUser> userList; 

    #endregion Fields 

    #region Constructors 

    public MediaEnquiryParticipantViewModel(SessionContext sessionContext, NavigationItem navigationItem, MediaEnquiryViewModel mediaEnquiryViewModel, Mediator mediator) 
     : base(mediator) 
    { 
     SessionContext = sessionContext; 
     NavigationItem = navigationItem; 
    } 

    #endregion Constructors 

    #region Properties 

    public IQueryable<caUser> UserList 
    { 
     get 
     { 
      if (userList == null) 
      { 
       userList = GetUserList(); 
      } 
      return userList; 
     } 
     set 
     { 
      userList = value; 
      OnPropertyChanged("UserList"); 
     } 
    } 

    #endregion Properties 

    #region Methods 

    private IQueryable<caUser> GetUserList() 
    { 
     IQueryable<caUser> list = (from u in ((Chase_Media_Pro_Entity_Model)this.NavigationItem.ObjectContext).caUser 
            select u); 

     return list; 
    } 

    #endregion Methods 
} 

Le userList est pour la zone de liste déroulante en MediaEnquiryParticipantView.

+0

"Maintenant, mon problème est que je veux que View (MediaEnquiryParticipantView) représente 1 ligne d'une table." quel est l'objet de votre table dans votre viewmodel et comment est-ce lié à ui? – blindmeis

+0

J'utilise Entity Framework donc une liste d'objets: private IQueryable mediaEnquiryParticipantList – Willem

+0

la liaison est dans la grille: DataSource = "{Chemin de liaison = MediaEnquiryParticipantList, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}" – Willem

Répondre

0

si vous spécifiez le DataType pour la ligne, cela devrait fonctionner.

<DataTemplate DataType="{x:Type YourRowObjectTypeGoesHere}"> 
    <ui:MediaEnquiryParticipantView /> 
</DataTemplate> 

avec ce DataTemplate tous les objets de ligne seront affichés en tant que MediaEnquiryParticipantView.

modifier:

<ListBox ItemSource={Binding YourViewModelListTable}> 

</ListBox> 

si votre YourViewModelListTable ne contient que vos lignes templated. ils seront affichés dans la liste comme ui: MediaEnquiryParticipantView pour chaque ligne.

+0

Bonjour, Merci pour la réponse. J'ai un problème avec le gabarit de données tho. J'ai d'abord une question: Lorsque la grille génère le modèle de données, crée-t-elle un nouvel objet à chaque fois pour chaque modèle de données? Deuxièmement, j'ai des listes déroulantes que j'ai besoin de renseigner sur la vue. Maintenant, mon problème est que je dois le faire dans le modèle Voir. J'ai besoin de savoir comment aborder cette cause, j'ai besoin de créer le modèle de vue d'une certaine manière. – Willem

+0

N'est-ce pas une meilleure option pour lier la clé primaire (MediaEnquiryParticipantID) à une propriété de dépendance dans MediaEnquiryParticipantView et de là créer mon viewmodel et remplir les contrôles? Pourquoi je demande est que j'ai essayé le type de données, mais sans chance .... – Willem

+0

si vous utilisez datatemplate pour créer votre vue pour vos viewmodels, vous avez raison chaque fois qu'une nouvelle vue est créée. peut-être que vous devriez poster votre code pour la grille de données et votre viewmodel. J'ai posté un exemple de code qui devrait fonctionner en général. – blindmeis