2009-03-26 37 views
12

Có thể liên kết Sự kiện trong DataTemplate Silverlight không? Nếu vậy, cách tốt nhất để làm điều đó là gì?Có thể liên kết Sự kiện trong DataTemplate Silverlight không?

Ví dụ giả sử bạn đã tạo ra một DataTemplate mà có một nút trong nó, như thế này:

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

Sau đó, bạn áp dụng nó vào một ListBox ItemTemplate, như thế này:

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

Nếu bạn đặt ItemSource của ListBox thành danh sách các đối tượng của lớp:

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

Sau đó bạn bắt thứ Nhấn nút e từ mỗi nút từ DataTemplate trong danh sách? Bạn có thể sử dụng ràng buộc để ràng buộc sự kiện Nhấp vào một phương thức trong "MyButtonClass" hay không, như sau:

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

Điều này có hiệu quả không? Nếu vậy, tôi nên đặt gì vào "MyDataClass" để bắt sự kiện?

Cảm ơn, Jeff

+0

Đây chính là lý do tại sao Lệnh tốt hơn. Trong khung công tác .NET 4, bạn có thể ràng buộc các lệnh (không giống như các sự kiện), do đó bạn vẫn có thể sử dụng MVVM mà không có chức năng xem mã-đằng sau và ràng buộc. –

Trả lời

4

Có một vài lựa chọn.

Một. thực hiện một điều khiển tùy chỉnh được ràng buộc đối tượng dữ liệu cho hàng đó. Trên điều khiển tùy chỉnh đó thêm trình xử lý cho đối tượng bị ràng buộc.

Tôi không nghĩ rằng việc ràng buộc của bạn trên nhấp chuột sẽ hoạt động. Sans the Binding Statment và chỉ khai báo nhấp chuột của bạn vào một chuỗi.

Thêm trình xử lý trên trang nơi điều khiển được đặt. Hãy nhớ rằng nếu bạn ràng buộc theo cách này, bạn sẽ chỉ có thể làm việc với người gửi của mục đó (nút) và thuộc tính của nó. Nếu bạn cần phải nhận được tại các thuộc tính cụ thể trên một đối tượng bạn có thể tốt hơn theo đuổi các tùy chọn đầu tiên.

Ví dụ nhỏ thể hiện chức năng bằng cách thêm 10 nút vào hộp danh sách có sự kiện nhấp chuột. 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}"/> 

Mã Đằng sau (tôi chỉ cắm này tất cả vào 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

gì tôi sẽ làm là tạo một nút có sử dụng mẫu lệnh để xử lý nhấp chuột. Trong khung công tác .NET 4, bạn có thể liên kết commands cho những người tồn tại trên mô hình xem.

Các vấn đề liên quan