WPF: DataGrid найти и заменить - PullRequest
2 голосов
/ 04 августа 2010

Я использую DataGrid для отображения значений определенных свойств коллекции объектов. Я реализовал поиск и выделение ячеек с помощью метода, аналогичного методу в блоге Томера Шамама .

Однако теперь мне нужно реализовать функциональность типа Найти / Заменить . Я предполагал, что смогу перебирать ячейки DataGrid для выделения и замены, но, похоже, не существует простого способа сделать это.

Есть идеи?

1 Ответ

2 голосов
/ 23 октября 2011

Я думаю, у вас, возможно, неправильное мышление в этом сценарии, возможно, вы переходите из WinForms в мир WPF ...

В WPF DataGrid вы в основном никогда не манипулируете данными через DataGrid, вы всегда работаете непосредственно с источником данных. Что касается «кажется, не существует простого способа сделать это» - вы правы. Это будет сложнее, чем следовало.

Если бы я должен был реализовать функцию поиска / замены - каждый щелчок сначала выделил бы следующий случай, затем я мог бы либо пропустить / найти_следующий, либо заменить - тогда я бы сделал это так:

1) Нам нужно знать нашу текущую позицию - DataGrid.CurrentItem дает текущий объект (источник данных);
2) Теперь мы выполняем поиск по источнику данных, чтобы найти следующий случай, начиная с текущего местоположения объекта (например, var indx = List<object>.FindIndex(...), за которым следует var nextItem = List<object>[indx]);
3) Затем нам нужно прокрутить DataGrid до найденного объекта и отобразить DataGridRow - DataGrid.ScrollIntoView(nextItem); (перед вызовом может потребоваться выполнить DataGrid.UpdateLayout (), возможно, есть некоторые изюминки со встроенным .NET 4 - в DataGrid по моему опыту);
4) Вы уже должны знать, как выделить ячейку ...;
5) Дождитесь ввода пользователя, либо пропустите, либо замените;
6) Если мы заменим, мы можем либо использовать DataGrid.CurrentItem , либо переменную nextItem и заменить некоторое значение новым значением. В зависимости от того, как вы настроили свою DataGrid, вам может потребоваться выполнить некоторый вызов Refresh () / UpdateLayout () или BindingOperations.GetBindingExpression (...). UpdateTarget (), чтобы обновить DataGrid;
7) Наконец, вернитесь к шагу 1 и повторите;

...