2009-03-26 9 views
12

Est-il possible de lier un événement dans un DataTemplate Silverlight? Si oui, quelle est la meilleure façon de le faire?Est-il possible de lier un événement dans un DataTemplate Silverlight?

Par exemple, supposons que vous avez créé un DataTemplate qui a un bouton, comme ceci:

<UserControl.Resources> 
    <DataTemplate x:Key="MyDataTemplate" > 
    <Grid> 
     <Button Content="{Binding ButtonText}" Margin="4" /> 
    </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

Ensuite, vous appliquez à une ItemTemplate ListBox, comme ceci:

<Grid x:Name="LayoutRoot" Background="White"> 
    <ListBox x:Name="lbListBox" ItemTemplate="{StaticResource MyDataTemplate}" />  
</Grid> 

Si vous définissez ItemSource à une liste d'objets de la classe de la zone de liste:

public class MyDataClass 
{ 
    public string ButtonText{ get; set; } 
} 

Comment puis-vous attraper e Le bouton e clique sur chaque bouton du DataTemplate dans la liste? Pouvez-vous utiliser la liaison à lier l'événement Click à une méthode dans « MyButtonClass », comme ceci:

<UserControl.Resources> 
    <DataTemplate x:Key="MyDataTemplate" > 
    <Grid> 
     <Button Click="{Binding OnItemButtonClick}" Content="{Binding ButtonText}" Margin="4" /> 
    </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

Est-ce que ce travail? Si oui, que dois-je mettre dans le "MyDataClass" pour attraper l'événement?

Merci, Jeff

+0

C'est exactement pourquoi les commandes sont meilleures. Dans le framework .NET 4, vous pouvez lier des commandes (contrairement à des événements) de sorte que vous puissiez toujours utiliser MVVM sans afficher de code AND derrière la fonctionnalité de liaison. –

Répondre

4

Il y a deux options.

Un. créer un contrôle personnalisé lié à l'objet de données pour cette ligne. Sur ce contrôle personnalisé, ajoutez le gestionnaire pour l'objet lié.

Je ne pense pas que votre liaison sur le clic fonctionnera. Sans la déclaration de liaison et déclarez simplement votre clic sur une chaîne.

Ajoutez le gestionnaire sur la page où se trouve le contrôle. Gardez à l'esprit que si vous liez de cette façon, vous ne pourrez travailler qu'avec l'expéditeur de cet élément (bouton) et ses propriétés. Si vous souhaitez obtenir des attributs spécifiques sur un objet, il est peut-être préférable de poursuivre la première option.

Petit exemple illustrant la fonctionnalité en ajoutant 10 boutons à une zone de liste avec des événements click. HTH

DataTemplate XAML

<UserControl.Resources> 
    <DataTemplate x:Name="MyDataTemplate"> 
     <Grid> 
      <Button Click="Button_Click" Content="{Binding ItemText}"/> 
     </Grid> 
    </DataTemplate> 
</UserControl.Resources> 

ListBox XAML

<ListBox x:Name="ListBoxThingee" ItemTemplate="{StaticResource MyDataTemplate}"/> 
code

Derrière (je viens tout cela branché dans le fichier Page.xaml

public class MyClass 
{ 
    public string ItemText { get; set; } 
} 


public partial class Page : UserControl 
{ 
    ObservableCollection<MyClass> _Items; 
    public Page() 
    { 
     InitializeComponent(); 

     _Items = new ObservableCollection<MyClass>(); 

     for (int i = 0; i < 10; i++) 
     { 
      _Items.Add(new MyClass() {ItemText= string.Format("Item - {0}", i)}); 
     } 

     this.ListBoxThingee.ItemsSource = _Items; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Button _b = sender as Button; 
     if (_b != null) 
     { 
      string _s = _b.Content as string; 
      MessageBox.Show(_s); 
     } 

    } 
} 
2

Ce que je voudrais faire est de créer un bouton qui utilise le modèle de commande pour la gestion des clics Dans le framework .NET 4, vous pouvez lier commands à ceux qui existent sur le modèle de vue.