Как определить значение выбранной ячейки в DataGrid? (WPF)

Как я могу определить SelectedCell"s Value В DataGrid? (WPF)

мой DataGrid имеет 9 колон и 5 рядов, и я хочу знать, Value кликаемой строки [0] Value,

Я использовал этот код в форме Windows:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    var a = dataGridView1[e.ColumnIndex, e.RowIndex].Value;
}

но я не знаю эквивалентного кода в wpf.

5 ответов

Решение

Вы должны использовать событие DataGrid_SelectedCellsChanged.

    private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        foreach (var item in e.AddedCells)
        {
            var col = item.Column as DataGridColumn;
            var fc = col.GetCellContent(item.Item);

            if (fc is CheckBox)
            {
                Debug.WriteLine("Values" + (fc as CheckBox).IsChecked);
            }
            else if(fc is TextBlock)
            {
                Debug.WriteLine("Values" + (fc as TextBlock).Text);
            }
            //// Like this for all available types of cells
        }
    }

НТН

Определение значения выбранной ячейки - это скорее вещь WinForms. WPF предназначен для работы по-разному; Ваш пользовательский интерфейс должен быть отделен от логики. Таким образом, DataGrid становится инструментом для представления, а не тем, что нужно ткнуть и подтолкнуть к ценностям.

Вместо этого с WPF вы хотите иметь дело с объектами, которые вы привязали к сетке, независимо от того, как они отображаются. Забудьте сетку - просто найдите объект, который в данный момент "выбран" пользователем, из списка связанных объектов.

SelectedItem - это свойство самой сетки, и благодаря превосходным механизмам связывания WPF вы можете связать это значение со свойством ViewModel через XAML:

ItemsSource="{Binding Orders, Mode=OneWay}" 
SelectedItem="{Binding SelectedOrder, Mode=TwoWay}"

Когда пользователь выбирает элемент в сетке, двусторонняя привязка обновит свойство SelectedItem в ViewModel, указав значение этого объекта в этой строке.

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

Я надеюсь, что в этом есть смысл. Я знаю, что это другой подход и другой способ мышления от WinForms.

Я нашел решение, опубликованное другими пользователями в другом потоке в stackru: WPF Toolkit DataGrid SelectionChanged Получение значения ячейки

Попытайся.

    private void dataGrid1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        var item = e.AddedCells[0];
        {
            var col = item.Column as DataGridColumn;
            var fc = col.GetCellContent(item.Item);

            if (fc is CheckBox)
            {

            }
            else if (fc is TextBlock && col.DisplayIndex == 0)
            {
                textBlock1.Text = (fc as TextBlock).Text;
            }

        }
    }

Иногда привязка к SelectedItem не работает (в зависимости от того, насколько сумасшедшей должна быть ваша модель. Мне нужно транспонировать модель, чтобы все было вверх ногами, и нормальные значения по умолчанию не работают все время.
в dataGrid selectedCellChanged вы можете получить доступ к связанному объекту:

исходя из предыдущего примера Orders[], где каждый Order будет иметь массив SubOrders

foreach (var selectedCell in e.AddedCells)    
{  
    var order = (Order)selectedCell.Item;
    var subOrder = order.SubOrders[selectedCell.Column.DisplayIndex-1];

    var someValue = subOrder.Value;

}

Другие вопросы по тегам