2011-08-19 62 views
19

我有一個Games的列表,它只有一個ID,DateTime。 我將此列表設置爲DataContextWPF ListView每行上有按鈕

然後我對這些遊戲是DataTemplate

<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> 

要使用的模板,我只是簡單地這樣做:

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

我需要一個Button添加到每個行在這個列表視圖中有相同的點擊事件,但會以某種方式傳遞正在點擊按鈕的遊戲的ID。

我該怎麼做?我被卡住了。 如果沒有任何意義,請告訴我,我會盡力解釋。

回答

38

在第一部分中,添加一個ButtonDataTemplate和訂閱Click事件

<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> 

在事件處理程序背後的代碼,你可以得到的點擊ButtonDataContext,並找出想要開

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

謝謝你的工作完美,很容易理解。 – twaldron

15

很容易。將Button添加到您的DataTemplate,給它一個Command,然後設置CommandParameter="{Binding}"。 DataTemplate中的DataContext是對象。

根據要求,使用命令的一些鏈接。

HTH,

+2

這是一個更好的解決方案。自從我寫MVVM代碼以來,我甚至認爲在代碼後面使用事件處理程序(即* xaml.cs *)。它太好了。 – Dennis

+1

丹尼斯是一個代碼示例,說明如何執行命令綁定(或至少是現有鏈接的其餘部分)的代碼示例,這對您的答案會非常有幫助。 在這些情況下,我還喜歡使用Commands和使用Binding的參數。 – EtherDragon

+0

@Ether:我通常會在需要的時候舉一個例子,但是由於Commands是如此精彩的主題,我會進行Google搜索,並在我的答案中添加一些更好的結果。 – Dennis

2

隨着ListBox.ItemTemplate。然後在您的點擊事件中,您可以通過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

如何從btn.DataContext獲取值?例如,在調試器中,我可以看到btn.DataContext指向我的數據類(LVDATA),我需要的是字符串Name中的值。我如何訪問這個? – zetar