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に何か特別なものが必要なのでしょうか、それとも回り道でこれを行うのでしょうか?任意のヘルプ/アドバイスに感謝します。
基本的に、ボタンは行データオブジェクトのデータコンテキストを継承します。私はそれを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
}
これを行うもう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;
}
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)
{
}
}
MyObject obj= (MyObject)((Button)e.Source).DataContext;
DataGridのDataContextがDataViewオブジェクト(DataTableのDefaultViewプロパティ)である場合、これも実行できます。
private void Button_Click(object sender, RoutedEventArgs e) {
DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}