it-swarm.com.ru

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

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

91
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
}
118
Jobi Joy

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

Другой способ, который связывается с параметром команды 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

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

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