2011-08-19 10 views
19

GamesのリストはIDDate、およびTimeです。 このリストをDataContextとして設定しています。各行のボタンを使用したWPFリストビュー

私は、あるこれらのゲームのためのDataTemplateている:私は、各行にButtonを追加する必要が

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

:、私は単純にこれを

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

テンプレートを使用するためにやっていますこのリストビューでは同じクリックイベントが発生しますが、ボタンがクリックされているゲームのIDは何らかの形で渡されます。

どうすればいいですか?ハマった。 それが意味をなさない場合は私に知らせてください。私はより良く説明しようとします。最初の部分については

答えて

38

DataTemplateButtonを追加し、イベントハンドラの背後にあるコードで

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

Clickイベントをサブスクライブ、クリックした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

簡単に。 ButtonDataTemplateに追加し、Commandとし、CommandParameter="{Binding}"と設定します。 DataTemplate内のDataContextがオブジェクトです。

要求通りに、コマンドを使用するためのリンクがあります。

HTH、

+2

これはきれいな溶液です。私はMVVMコードを書いているので、イベントハンドラをコードの背後で使用することさえ考えます(つまり* xaml.cs *)。それはずっといいです。 – Dennis

+1

Dennis、残りのコマンドバインディング(または少なくとも既存のものへのリンク)を行う方法のコード例は、あなたの答えに本当に役立ちます。 このような場合、Bindingを使用してパラメータを指定したコマンドを使用することをお勧めします。 – EtherDragon

+0

@ Ether:私は通常、コマンドがそのようによくカバーされているので、必要なときに一緒に例を挙げます。私は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)を指していることがわかります。必要なのはstring Nameの値です。これにはどうすればアクセスできますか? – zetar

関連する問題