Ahmed Dabas Ответов: 2

Как выполнить итерацию в datagrid, чтобы получить строки и столбцы в WPF ?


У меня есть DataGrid с двумя столбцами , одна тема-это столбец checkbox, а другая-текстовый столбец .

Я хочу перебрать строки DataGrid и проверить , была ли отмечена ячейка CheckBox, а затем добавить эту строку в список сотрудников

это в winforms все для этого есть:
foreach(var r в DataGridRows)
{
if(r.cell[0].value == true)
{
// Задач
}

}

Что я уже пробовал:

for (int i = 0; i < dg.Items.Count; i++)
    {
        DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
            for (int j = 0; j < dg.Columns.Count; j++)
            {
                var cellContent = dg.Columns[j].GetCellContent(row) as CheckBox;
               
            }
    }

2 Ответов

Рейтинг:
0

PureNsanity

Как правило, вы хотите избежать прямой работы с элементами пользовательского интерфейса, если только это не специфично для пользовательского интерфейса, и в вашей проблеме речь идет о деловых отношениях, поэтому вы действительно хотите, чтобы это было в модели представления. В этом примере я бы рекомендовал какую-то EmployeeViewModel с логическим свойством IsAdded (конечно, сделайте имя свойства значимым для того, что оно добавлено).

Я бы поставил флажок только для чтения и имел кнопку под сеткой, привязанную к команде в коллекции, которая является чем-то вроде ICommand AddEmployeeToCollectionCommand, передающей EmployeeViewModel (я предпочитаю реализацию DelegateCommand в PRISM). Конечно, вам также нужно иметь кнопку удаления или использовать ее в качестве добавления/удаления (вы можете использовать конвертер или триггер на кнопке, чтобы соответствующим образом изменить имя).

Если вы действительно хотите обработать событие щелчка, то я рекомендую обрабатывать событие щелчка на уровне сетки (это маршрутизируемые команды). Таким образом, сетка/представление может манипулировать моделью представления более высокого уровня (надеюсь, она есть), переключая состояние контекста исходных данных.


Рейтинг:
0

Andrew Baylis

Я рекомендую альтернативу - использовать привязанную сетку данных, где элементы имеют два поля, которые вы хотите отобразить в сетке. Например:

public class DataItem : DependencyObject
{
    public static readonly DependencyProperty DisplayTextProperty = DependencyProperty.Register("DisplayText", typeof(string), typeof(DataItem), new PropertyMetadata(default(string)));
    public string DisplayText { get { return (string)GetValue(DisplayTextProperty); } set { SetValue(DisplayTextProperty, value); } }
    public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(DataItem), new PropertyMetadata(default(bool)));
    public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty); } set { SetValue(IsSelectedProperty, value); } }
}

Использование объекта DependencyObject гарантирует, что DataGrid правильно отображает свойства.
Теперь просто создайте список этих элементов данных и назначьте его ItemSource DataGrid
...
List<DataItem> list = new List<DataItem>();
...fill list with items ...
dataGrid.ItemsSource = list;
...


Чтобы проверить необходимые из них, просто сканируйте список либо с помощью цикла foreach, либо с помощью селектора LINQ.
foreach(DataItem item in list)
{
  if (item.IsSelected) 
  {
   ... do your stuff here ...
  }
}