2010-08-05 3 views
2

У меня есть фундаментальный вопрос:WPF DataGrid Binding и CheckBox

Предположим, у меня есть список элементов какого-либо класса. И у меня также есть DataGrid, который отображает свойства элементов этого списка. Я хочу, чтобы пользователь выбирал некоторые элементы через дополнительный столбец флажка (фактически datagridtemplatecolumn). Затем он нажимает кнопку, и некоторые функции обрабатываются некоторой функцией. Как я могу реализовать логику этого флажка?

  1. Должен ли я добавить логическое свойство в мой класс и связать его с столбцом флажка? (Я думаю, нехорошо добавить дополнительное свойство в мой основной класс только ради пользовательского интерфейса)

  2. Должен ли я сделать некоторый класс-оболочку с булевым свойством и связать DataGrid со списком класса-оболочки? (Лучше соответствует правилам ООП, чем первый вариант)

  3. Сделать несвязанный столбец флажка. Затем проверьте строки данных в цикле, чтобы собрать выбранные элементы перед обработкой. (Это то, что я хотел сделать, но неуправляемый столбец флажка ведет себя очень странно: когда я переключаю один флажок, еще несколько других переключаются. И я также не нашел способ просмотреть все строки DataGrid).

  4. Ваш вариант ...

И я хочу, чтобы сделать этот материал в соответствии с правилами ООП. Это основное требование. Вот почему я не могу принять первый вариант, если вы не скажете мне, что все в порядке и обычно используется.

ответ

1

Я голосую за # 2; он гелей с шаблоном MVVM, который, я думаю, является единственным способом сделать прямолинейную разработку в WPF. Таким образом, вы создадите класс модели представления, который обертывает ваш объект домена, чтобы обрабатывать связь между флажками и изменениями свойств и т. Д., И все время запуска событий PropertyChanged и поддержания вашего пользовательского интерфейса в актуальном состоянии.

-1

Мы столкнулись с одной и той же дилеммой и в конечном итоге оказались с вариантом №1 добавления логического свойства в класс IsSelected Почему? Когда это действительно дошло до:

  • это был самый простой
  • может быть повторно предназначен для любого типа связывания
  • и, наконец, ... потому что Josh Smith использует IsSelected *

Конечно, это может нарушить какое-то золотое правило MVVM, но иногда правила должны быть сломаны.


* Я не могу вспомнить точный пример Джош, но Вы можете увидеть его использование в одном из своих постов в блоге: The Initially Selected Item when Binding to a Grouped ICollectionView

+0

У меня такая же идея, но как только я устанавливаю флажок в datagrid, Ilist не обновляется, есть ли у вас пример того, как вы это делаете? спасибо! –

+0

@GerardoJaramillo - Я бы порекомендовал вам начать новый вопрос и, возможно, ссылаться на этот вопрос в своем посте. Обязательно укажите, что у вас есть соответствующие фрагменты кода и все остальное, что поможет сообществу воспроизвести проблему. –

0

ребят я просто попробовать это решение и отлично работает, может быть, не лучший, но он работает.

bool? valor = false; 
       foreach (var d in DetalleFactura.Items) 
       { 
        DataGridRow row = (DataGridRow)DetalleFactura.ItemContainerGenerator.ContainerFromItem(d); 
        if (DetalleFactura.Columns[0].GetCellContent(row) is CheckBox) 
        { 
         valor = ((CheckBox)DetalleFactura.Columns[0].GetCellContent(row)).IsChecked; 

        } 

       }