Получить "данные" при нажатии Кнопки?

дорогие друзья! Тыкните пожалуйста мое лицо в ссаную тряпку, но никак не могу сообразить...

Есть таблица DataGrid: введите сюда описание изображения

Хочу при нажатии на Кнопку Ping в колонке Operations, получить значение из колонки IP Adress текущий строки... для дальнейших манипуляций.

Datagrid заполняю обычным кодом

ObservableCollection<User> users = new ObservableCollection<User>();

users.Add(new User { ... );

В Xaml у меня просто:

<DataGridTemplateColumn.CellTemplate>

    <DataTemplate>

        <Button Content="Ping" Click="Button_Click"/>

    </DataTemplate>

</DataGridTemplateColumn.CellTemplate>

Обработчик кнопки (пусто):

private void Button_Click(object sender, RoutedEventArgs e)
{
    \\ я так понимаю тут я должен как-то отловить нужную строку...хз как..и получить
    \\ данные из ячейки строки, которая была выбрана..
}

Подскажите пожалуйста как это сделать!!! Без всяких MVVM (для меня это пока дремучий лес!)


Ответы (2 шт):

Автор решения: Cost

Если без MVVM, то присваиваем DataGrid имя: <DataGrid Name="dg" ... > и теперь в Button_Click можем получить нужную строку:

var selectedUser = dg.SelectedItem as User;

Ну а дальше из свойства получаете IP-адрес

→ Ссылка
Автор решения: aepot

Здесь всё просто сделать через команду. MVVM здесь не требуется, это не про MVVM, это про команды.

Берём класс, упрощающий взаимодействие с командами и добавляем в проект, например в файл RelayCommand.cs.

public class RelayCommand : ICommand
{
    private readonly Action<object> _execute;
    private readonly Predicate<object> _canExecute;

    public event EventHandler CanExecuteChanged
    {
        add => CommandManager.RequerySuggested += value;
        remove => CommandManager.RequerySuggested -= value;
    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute = null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);
    public void Execute(object parameter) => _execute(parameter);
}

Назначаем DataContext окну прямо на него самого.

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
}

DataContext нужен для работы привязок Binding в XAML. (в MVVM он назначается на экземпляр класса вью-модели)

Теперь вместо обработчика создаём саму команду

public ICommand PingCommand { get; } = new RelayCommand(parameter =>
{
    User user = (User)parameter;
    // код
}, parameter => parameter is User); // это CanExecute если условие не выполняется, кнопка задизаблится

Кнопка проверяет CanExecute команды каждый раз перед выполнением команды примерно так:

if (command.CanExecute(parameter))
{
    command.Execute(parameter);
}

То есть это даёт гарантию, что вы никогда не получите InvalidCastException в строчке (User)parameter. Ну и плюс кнопка сама задизаблится, это удобно.

Если у вас команда такая, что CanExecute всегда true, то его можно просто не указывать, он необязателен.

И просто прописываем команду в кнопку

<Button Content="Ping"
        Command="{Binding PingCommand, RelativeSource={RelativeSource, AncestorType=Window}}"
        CommandParameter="{Binding}"/>

Готово. Никаких x:Name не требуется.

→ Ссылка