[c#] 열의 버튼, 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 메서드에서 버튼이있는 데이터 그리드의 행을 가져올 수있는 방법이 있습니까? 보다 구체적으로, 내 개체의 속성 중 하나는 “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
}


답변

이 작업을 수행하는 또 다른 방법은 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;
}


답변

명령 매개 변수 DataContext에 바인딩하고 Jobi Joy와 같은 MVVM을 존중하는 또 다른 방법은 버튼이 데이터 컨텍스트 양식 행을 상속한다고 말합니다.

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


답변