WPF DataGrid-кнопка в столбце, получающая строку, из которой она появилась в обработчике событий Click



Я установил itemsource моего WPF Datagrid в список объектов, возвращенных из моего 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 появилась метод, есть ли способ получить строку в datagrid, где находится кнопка? Более конкретно, одним из свойств моих объектов является "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, или, может быть, я собираюсь сделать это окольным путем? Любая помощь/совет ценится.

1261   5  

5 ответов:

в основном ваша кнопка наследует datacontext объекта данных строки. Я называю его как объект 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
}

еще один способ, которым мне нравится это делать, - привязать идентификатор к свойству 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 и уважает MVVM, как Jobi Joy говорит, что кнопка наследует строку формы 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;

Если DataContext вашего DataGrid является объектом DataView (свойство DefaultView объекта DataTable), то вы также можете сделать это:

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

Comments

    Ничего не найдено.