2009-03-26 6 views
12

Ist es möglich, ein Ereignis in einem Silverlight DataTemplate zu binden? Wenn ja, was ist der beste Weg, dies zu tun?Ist es möglich, ein Ereignis in einem Silverlight DataTemplate zu binden?

Zum Beispiel, sagen Sie ein Datatemplate erstellt haben, die ein Button in ihm hat, wie folgt aus:

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

Dann Sie es auf einem ListBox ItemTemplate, wie folgt aus:

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

Wenn Sie die ItemSource der ListBox auf eine Liste von Objekten der Klasse:

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

Wie dann fangen Sie th Klicken Sie auf die Schaltfläche von jeder Schaltfläche aus dem DataTemplate in der Liste? Können Sie verbindlich das Click-Ereignis ein Verfahren in „MyButtonClass“, wie diese zu binden:

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

Würde das funktionieren? Wenn ja, was sollte ich in die "MyDataClass" setzen, um das Ereignis zu erfassen?

Danke, Jeff

+0

Dies ist genau, warum Befehle besser sind. Im .NET 4-Framework können Sie Befehle binden (im Gegensatz zu Ereignissen), sodass Sie MVVM immer noch ohne Code-Back-Funktion und AND-Bind-Funktionalität verwenden können. –

Antwort

4

Es gibt ein paar Optionen.

Eins. Erstellen Sie ein benutzerdefiniertes Steuerelement, das das Datenobjekt für diese Zeile bindet. Fügen Sie an diesem benutzerdefinierten Steuerelement den Handler für das gebundene Objekt hinzu.

Ich glaube nicht, dass Ihre Bindung auf den Klick funktioniert. Sans the Binding Statment und deklarieren Sie einfach Ihren Klick auf eine Zeichenfolge.

Fügen Sie den Handler auf der Seite hinzu, auf der sich die Steuerung befindet. Beachten Sie, dass Sie nur mit dem Absender dieses Elements (Schaltfläche) und seinen Eigenschaften arbeiten können, wenn Sie auf diese Weise binden. Wenn Sie auf bestimmte Attribute eines Objekts zugreifen müssen, sollten Sie besser die erste Option wählen.

Kleines Beispiel, das die Funktionalität durch Hinzufügen von 10 Schaltflächen zu einem Listenfeld mit Klickereignissen demonstriert. 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 Behind (Ich steckte gerade dies alles in die Page.xaml Datei

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

Was ich tun würde, ist erstellen eine Schaltfläche, die das Befehlsmuster für die Klickbehandlung verwendet.Im .NET 4-Framework können Siebindenzu denen, die auf dem Ansichtsmodell vorhanden sind.