Из моей статьи о Codeproject Руководство по форматированию сетки данных WPF с использованием привязок :
Подключение DataGrid к бизнес-данным
Даже подключение DataGrid с бизнес-данными нетривиально. По сути, CollectionViewSource используется для соединения DataGrid с бизнес-данными:
CollectionViewSource выполняет фактическую навигацию, сортировку, фильтрацию данных и т. Д. c.
<Window.Resources>
<CollectionViewSource x:Key="ItemCollectionViewSource" CollectionViewType="ListCollectionView"/>
</Window.Resources>
<DataGrid
DataContext="{StaticResource ItemCollectionViewSource}"
ItemsSource="{Binding}"
AutoGenerateColumns="False"
CanUserAddRows="False">
//create business data
var itemList = new List<stockitem>();
itemList.Add(new StockItem {Name= "Many items", Quantity=100, IsObsolete=false});
itemList.Add(new StockItem {Name= "Enough items", Quantity=10, IsObsolete=false});
...
//link business data to CollectionViewSource
CollectionViewSource itemCollectionViewSource;
itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource"));
itemCollectionViewSource.Source = itemList;
- Определить CollectionViewSource в Windows .Resource
- Гвоздь здесь заключается в том, что вы должны установить CollectionViewType. Если вы этого не сделаете, GridView будет использовать BindingListCollectionView, который не поддерживает сортировку. Конечно, MSDN нигде не объясняет этого.
- Установите DataContext из DataGrid в CollectionViewSource.
- В приведенном ниже коде найдите CollectionViewSource и назначьте свои бизнес-данные свойству Source
В этой статье данные только читаются. Если пользователь должен иметь возможность редактировать данные, используйте ObservableCollection. Однако часто лучше оставлять DataGrid только для чтения, потому что редактирование в DataGrid ведет себя не так, как в программах для работы с электронными таблицами. Возможно, будет лучше, если пользователь дважды щелкнет по строке, которую он хочет изменить, и откроет другое окно только для редактирования этой сущности или добавления новой.