2011-08-19 27 views
19

Tôi có danh sách Games chỉ có một số ID, một số DateTime. Tôi đang thiết lập danh sách này là DataContext.Danh sách phát WPF với các nút trên mỗi dòng

sau đó tôi có một DataTemplate cho các trò chơi đó là:

<DataTemplate DataType="{x:Type loc:Game}"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <TextBlock Name="dateBlock" Grid.Column="0" Grid.Row="1" 
        Text="{Binding Date, StringFormat=d}"></TextBlock> 
     <TextBlock Name="TimeBlock" Grid.Column="1" Grid.Row="1" 
        Text="{Binding Time}"></TextBlock> 
     //need to but a button here for each row 
    </Grid> 
</DataTemplate> 

Để sử dụng mẫu, tôi chỉ đơn giản là chỉ làm điều này:

<ListBox ItemsSource="{Binding}"></ListBox>  

tôi cần phải thêm một Button với từng ngành nghề trong chế độ xem danh sách này có cùng sự kiện nhấp chuột, nhưng bằng cách nào đó sẽ chuyển ID của trò chơi mà nút được nhấp vào.

Tôi làm cách nào để thực hiện việc này? Tôi bị mắc kẹt. Nếu điều đó không có ý nghĩa, hãy cho tôi biết và tôi sẽ cố gắng giải thích tốt hơn.

Trả lời

38

Đối với phần đầu tiên, thêm một Button đến DataTemplate và đăng ký với Click kiện

<DataTemplate DataType="{x:Type loc:Game}"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
      <ColumnDefinition Width="100"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <TextBlock Name="dateBlock" Grid.Column="0" Grid.Row="1" Text="{Binding Date, StringFormat=d}"></TextBlock> 
     <TextBlock Name="TimeBlock" Grid.Column="1" Grid.Row="1" Text="{Binding Time}"></TextBlock> 
     <Button Click="Button_Click">X</Button> 
    </Grid> 
</DataTemplate> 

Trong đoạn mã sau xử lý sự kiện, bạn có thể lấy DataContext của nhấp Button và tìm ra Id như

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Button button = sender as Button; 
    Game game = button.DataContext as Game; 
    int id = game.ID; 
    // ... 
} 
+1

Cảm ơn bạn đã làm việc hoàn hảo và dễ hiểu. – twaldron

15

Dễ dàng. Thêm Button vào DataTemplate của bạn, cung cấp cho nó Command và sau đó đặt CommandParameter="{Binding}". DataContext trong DataTemplate là đối tượng.

Theo yêu cầu, một số liên kết đến sử dụng lệnh.

HTH,

+2

Nó là một giải pháp neater. Vì tôi đã viết mã MVVM, tôi thậm chí còn nghĩ đến việc sử dụng trình xử lý sự kiện trong mã phía sau (tức là * xaml.cs *). Nó đẹp hơn rất nhiều. – Dennis

+1

Dennis, một ví dụ về cách làm phần còn lại của Command Binding (hoặc ít nhất là một liên kết đến một cái hiện có) sẽ thực sự hữu ích trong câu trả lời của bạn. Trong những trường hợp này, tôi cũng thích sử dụng Lệnh với tham số bằng cách sử dụng Ràng buộc. – EtherDragon

+0

@Ether: Tôi thường sẽ ném cùng một ví dụ khi nó được yêu cầu, tuy nhiên như lệnh cũng được đề cập chủ đề tôi sẽ thực hiện tìm kiếm của Google và thêm một vài kết quả tốt hơn vào câu trả lời của tôi. – Dennis

2

Với ListBox.ItemTemplate. Sau đó, trong sự kiện bấm của bạn, bạn có thể nhận được đối tượng thông qua DataContext.

<ListBox.ItemTemplate> 
     <DataTemplate> 
      <Button Content="^" IsEnabled="{Binding Path=IsNotFirst, Mode=OneWay}" 
      Click="btnMoveFDAup"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 


    private void btnMoveFDAup(object sender, RoutedEventArgs e) 
    { 
     Button btn = ((Button)sender); 
     // btn.DataContext will get you to the row object where you can retrieve the ID 
    } 
+0

Làm cách nào để nhận các giá trị từ btn.DataContext? Ví dụ, trong trình gỡ lỗi tôi có thể thấy btn.DataContext đang trỏ đến lớp dữ liệu của tôi (LVDATA) và những gì tôi cần là giá trị trong String name. Tôi làm cách nào để truy cập? – zetar

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