2012-11-12 3 views
1

J'ai cherché un peu, mais l'information que j'ai trouvée n'est pas ce dont j'ai besoin. J'ai donc décidé de vous demander à tous - je suis sûr que c'est une question de débutant mais je ne comprends vraiment pas. Commençons par: J'ai une source de données qui est une collection observable groupée. En ce moment j'ai 2 groupes avec un nombre différent d'articles. Les deux groupes et les éléments appartiennent à la même base commune:Lier une collection groupée dans Xaml

public DataCommon(String uniqueId, String title, String subtitle, String imagePath, String description) 
    { 
     this._uniqueId = uniqueId; 
     this._title = title; 
     this._subtitle = subtitle; 
     this._description = description; 
     this._imagePath = imagePath; 
    } 

Ceci est le constructeur du modèle. Dans le ViewModel je le remplis. Maintenant, je voudrais lier le ItemClick avec une commande à mon ViewModel. Je fais comme ceci (seulement une partie courte):

<GridView 
     x:Name="itemGridView" 
     AutomationProperties.AutomationId="ItemGridView" 
     AutomationProperties.Name="Grouped Items" 
     Grid.RowSpan="2" 
     Padding="116,137,40,46" 
     ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}" 
     ItemTemplate="{StaticResource Standard250x250ItemTemplate}" 
     SelectionMode="None" 
     IsSwipeEnabled="false" 
     IsItemClickEnabled="True" 
     > 
     <WinRtBehaviors:Interaction.Behaviors> 
      <Win8nl_Behavior:EventToCommandBehavior Event="ItemClick" Command="ItemClickCommand" CommandParameter="{Binding UniqueId}"/> 
     </WinRtBehaviors:Interaction.Behaviors> 

Mais maintenant le problème. À la "Binding UniqueId", il est dit que DataContext est mon ViewModel, donc je ne peux pas le connecter aux propriétés du modèle. J'ai regardé le Page.DataContext, j'ai dit à XAML d'utiliser mon ViewModel en tant que DataContext. Je suppose que c'était correct. Mais comment puis-je accéder aux propriétés du modèle? J'ai essayé de le faire comme ça (défini mon modèle comme DataModel):

<WinRtBehaviors:Interaction.Behaviors> 
      <Win8nl_Behavior:EventToCommandBehavior Event="ItemClick" Command="ItemClickCommand" CommandParameter="{Binding DataModel:SampleDataCommon.UniqueId}"/> 
     </WinRtBehaviors:Interaction.Behaviors> 

mais comme je devinais à l'avance qu'il ne fonctionne pas - comme paramètre i obtenir null.

Je serais reconnaissant pour toute aide, parce que je l'ai dit au début du poste: je ne comprends pas ...

Répondre

0

Vous ne pouvez pas utiliser EventToCommandBehavior de cette manière - ce fut aussi déclaré par son auteur dans le comments.

J'utilise les éléments suivants propriété jointe dans de tels cas:

public static class ItemClickBehavior 
{ 
    public static DependencyProperty ItemClickCommandProperty = DependencyProperty.RegisterAttached("ItemClickCommand", 
       typeof(ICommand), 
       typeof(ItemClickBehavior), 
       new PropertyMetadata(null, OnItemClickCommandChanged)); 

    public static void SetItemClickCommand(DependencyObject target, ICommand value) 
    { 
     target.SetValue(ItemClickCommandProperty, value); 
    } 

    public static ICommand GetItemClickCommand(DependencyObject target) 
    { 
     return (ICommand)target.GetValue(ItemClickCommandProperty); 
    } 

    private static void OnItemClickCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     var element = target as ListViewBase; 
     if (element != null) 
     { 
      // If we're putting in a new command and there wasn't one already 
      // hook the event 
      if ((e.NewValue != null) && (e.OldValue == null)) 
      { 
       element.ItemClick += OnItemClick; 
      } 

      // If we're clearing the command and it wasn't already null 
      // unhook the event 
      else if ((e.NewValue == null) && (e.OldValue != null)) 
      { 
       element.ItemClick -= OnItemClick; 
      } 
     } 
    } 

    static void OnItemClick(object sender, ItemClickEventArgs e) 
    { 
     GetItemClickCommand(sender as ListViewBase).Execute(e.ClickedItem); 
    } 
} 

Voici comment vous lier une commande à elle:

<GridView 
    x:Name="itemGridView" 
    AutomationProperties.AutomationId="ItemGridView" 
    AutomationProperties.Name="Grouped Items" 
    Grid.RowSpan="2" 
    Padding="116,137,40,46" 
    ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}" 
    ItemTemplate="{StaticResource Standard250x250ItemTemplate}" 
    SelectionMode="None" 
    IsSwipeEnabled="false" 
    IsItemClickEnabled="True" 
    itbmb:ItemClickBehavior.ItemClickCommand="{Binding ItemClickCommand}" 
    > 

Je suppose que ce ne serait pas tout ce que difficile de créer un comportement à partir de la propriété jointe si vous le souhaitez vraiment.

Questions connexes