2009-03-26 15 views
12

¿Es posible enlazar un evento en un DataTemplate de Silverlight? Si es así, ¿cuál es la mejor manera de hacerlo?¿Es posible enlazar un evento en un DataTemplate de Silverlight?

Por ejemplo, digamos que usted ha creado un DataTemplate que tiene un botón en ella, así:

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

A continuación, aplicarlo a un cuadro de lista ItemTemplate, así:

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

Si establece ItemSource del ListBox a una lista de objetos de la clase:

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

entonces, ¿cómo se contagia º e Haga clic en el botón de cada botón del DataTemplate en la lista? Se puede utilizar el enlace para enlazar el evento Click de un método en el "MyButtonClass", así:

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

Que este trabajo? Si es así, ¿qué debería poner en "MyDataClass" para ver el evento?

Gracias, Jeff

+0

Esto es exactamente por qué los comandos son mejores. En el marco de .NET 4, puede vincular comandos (a diferencia de los eventos) para que pueda seguir utilizando MVVM sin funcionalidad de vinculación AND de código de vista. –

Respuesta

4

Hay un par de opciones.

Uno. hacer un control personalizado que esté vinculado al objeto de datos para esa fila. En ese control personalizado agregue el controlador para el objeto encuadernado.

No creo que su enlace en el clic funcione. Sans the Binding Statment y solo declara tu clic en una cadena.

Agregue el controlador en la página donde se encuentra el control. Tenga en cuenta que si enlaza de esta manera, solo podrá trabajar con el remitente de ese elemento (botón) y sus propiedades. Si necesita obtener atributos específicos de un objeto, es mejor que siga la primera opción.

Pequeño ejemplo que demuestra la funcionalidad agregando 10 botones a un cuadro de lista con eventos de clic. HTH

DataTemplate XAML

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

XAML ListBox

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

Código Atrás (Acabo de poner todo esto en el archivo 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

Lo que yo haría es crear un botón que usa el patrón de comando para manejar los clics. En el marco .NET 4, puede vincular commands a los que existen en el modelo de vista.

Cuestiones relacionadas