2009-03-26 13 views
12

È possibile associare un evento in un DataTamplate Silverlight? Se sì, qual è il modo migliore per farlo?È possibile associare un evento in un DataTamplate Silverlight?

Per esempio, diciamo che hai creato un DataTemplate che ha un pulsante in esso, come questo:

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

Poi, lo si applica ad un ListBox ItemTemplate, in questo modo:

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

Se si imposta ItemSource del ListBox a un elenco di oggetti della classe:

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

Come allora si cattura ° e fare clic con il pulsante da ciascun pulsante del DataTemplate nell'elenco? È possibile utilizzare vincolante per legare l'evento Click per un metodo in "MyButtonClass", in questo modo:

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

Sarebbe questo lavoro? In tal caso, cosa devo inserire in "MyDataClass" per prendere l'evento?

Grazie, Jeff

+0

Questo è esattamente il motivo per cui i comandi sono migliori. Nel framework .NET 4 è possibile associare i comandi (diversamente dagli eventi) in modo da poter ancora utilizzare MVVM senza alcuna funzionalità code-behind e binding della vista. –

risposta

4

Ci sono un paio di opzioni.

Uno. crea un controllo personalizzato associato all'oggetto dati per quella riga. Su quel controllo personalizzato aggiungi il gestore per l'oggetto associato.

Non penso che la rilegatura del clic funzionerà. Sans the Binding Statment e basta dichiarare il tuo clic su una stringa.

Aggiungere il gestore nella pagina in cui è alloggiato il controllo. Ricorda che se esegui il binding in questo modo, sarai in grado di lavorare solo con il mittente dell'elemento (pulsante) e le sue proprietà. Se hai bisogno di ottenere attributi specifici su un oggetto, forse preferisci perseguire la prima opzione.

Piccolo esempio che dimostra la funzionalità aggiungendo 10 pulsanti a una casella di riepilogo con eventi di clic. 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}"/> 

codice sottostante (ho appena inserito tutto questo nel file 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

Quello che vorrei fare è creare un pulsante che utilizza il modello di comando per la gestione dei clic Nel framework .NET 4 è possibile associare commands a quelli esistenti sul modello di visualizzazione.

Problemi correlati