web-dev-qa-db-ja.com

列内のボタン、Clickイベントハンドラーで取得した行を取得

WPF Datagridのitemsourceを、DALから返されたオブジェクトのリストに設定しました。ボタンを含む追加の列も追加しました。xamlは下にあります。

<toolkit:DataGridTemplateColumn  MinWidth="100" Header="View">
    <toolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Click="Button_Click">View Details</Button>
        </DataTemplate>
    </toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>

これでうまくレンダリングされます。しかし、Button_Clickメソッドでは、ボタンが存在するデータグリッドの行を取得する方法はありますか?具体的には、オブジェクトのプロパティの1つが「Id」であり、これをイベントハンドラーの別のフォームのコンストラクターに渡すことができるようにしたいと思います。

private void Button_Click(object sender, RoutedEventArgs e)
    {
        //I need to know which row this button is on so I can retrieve the "id"  
    }

おそらく、xamlに何か特別なものが必要なのでしょうか、それとも回り道でこれを行うのでしょうか?任意のヘルプ/アドバイスに感謝します。

92
RekrowYnapmoc

基本的に、ボタンは行データオブジェクトのデータコンテキストを継承します。私はそれをMyObjectと呼んでおり、MyObject.IDがあなたが望んでいたものであることを願っています。

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyObject obj = ((FrameworkElement)sender).DataContext as MyObject;
    //Do whatever you wanted to do with MyObject.ID
}
119
Jobi Joy

これを行うもう1つの方法は、IDをボタンのCommandParameterプロパティにバインドすることです。

<Button Click="Button_Click" CommandParameter="{Binding Path=ID}">View Details</Button>

次に、コードで次のようにアクセスできます。

private void Button_Click(object sender, RoutedEventArgs e)
{
    object ID = ((Button)sender).CommandParameter;
}
41
xr280xr

Jobi JoyのようにコマンドパラメーターDataContextにバインドし、MVVMを尊重する別の方法では、ボタンはdatacontextフォーム行を継承します。

XAMLのボタン

<RadButton Content="..." Command="{Binding RowActionCommand}" 
                         CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>

コマンド実装

public void Execute(object parameter)
    {
        if (parameter is MyObject)
        {

        }
    }
10
Petr Šebesta
MyObject obj= (MyObject)((Button)e.Source).DataContext;
3
Shiha

DataGridのDataContextがDataViewオブジェクト(DataTableのDefaultViewプロパティ)である場合、これも実行できます。

private void Button_Click(object sender, RoutedEventArgs e) {
   DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}
0
SurfingSanta