Я занимаюсь созданием своего первого реального приложения WPF (т. Е. Первого, предназначенного для использования кем-то, кроме меня), и я все еще обворачиваю голову лучший способ сделать что-то в WPF. Это довольно простое приложение для доступа к данным, использующее еще довольно новую Entity Framework, но я не смог найти много рекомендаций в Интернете, чтобы наилучшим образом использовать эти две технологии (WPF и EF) вместе. Поэтому я подумал, что выброшу, как я подхожу к нему, и посмотрю, есть ли у кого-нибудь лучшие предложения.Рекомендации по использованию инфраструктуры Entity Framework с WPF DataBinding
Я использую Entity Framework с SQL Server 2008. EF поражает меня, как и гораздо более сложным, чем это должно быть, и еще не созрели, но Linq к SQL-видимому, умер, так Я мог бы также использовать технологию, на которую, похоже, сосредотачивается MS.
Это простое приложение, поэтому я еще не видел, как он может создавать отдельный слой данных вокруг него. Когда я хочу получить на данные, я использую довольно простых запросов Linq-на-Сущности, как правило, прямо из моего кода-за, например:
var families = from family in entities.Family.Include("Person") orderby family.PrimaryLastName, family.Tag select family;
Linq к Entity запросы возвращают IOrderedQueryable результат, который Безразлично автоматически отражают изменения в базовых данных, например, если я добавлю новую запись через код в модель данных сущности, существование этой новой записи не будет автоматически отражено в различных элементах управления, ссылающихся на запрос Linq. Следовательно, я бросал результаты этих запросов в ObservableCollection, захватить основные изменения данных:
familyOC = new ObservableCollection<Family>(families.ToList());
Я тогда карту ObservableCollection к CollectionViewSource, так что я могу получить фильтрацию, сортировку и т.д., без необходимости возвращаться в базу данных.
familyCVS.Source = familyOC; familyCVS.View.Filter = new Predicate<object>(ApplyFamilyFilter); familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("PrimaryLastName", System.ComponentModel.ListSortDirection.Ascending)); familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("Tag", System.ComponentModel.ListSortDirection.Ascending));
Я тогда связать различные элементы управления и что-нет к этому CollectionViewSource:
<ListBox DockPanel.Dock="Bottom" Margin="5,5,5,5" Name="familyList" ItemsSource="{Binding Source={StaticResource familyCVS}, Path=., Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource familyTemplate}" SelectionChanged="familyList_SelectionChanged" />
Когда мне нужно добавлять или удалять записи/объекты, я вручную сделать это как из данных объекта модель и ObservableCollection:
private void DeletePerson(Person person) { entities.DeleteObject(person); entities.SaveChanges(); personOC.Remove(person); }
Я обычно с использованием StackPanel и DockPanel управления для позиционирования элементов. Иногда я использую Grid, но мне сложно поддерживать: если вы хотите добавить новую строку в верхнюю часть сетки, вам нужно прикоснуться к каждому элементу управления, непосредственно размещенному в сетке, чтобы сообщить ему использовать новую строку. Uggh. (Microsoft никогда, казалось, не получала концепцию DRY.)
Я почти никогда не использую конструктор VS WPF для добавления, изменения или управления позициями. Дизайнер WPF, который поставляется с VS, несколько смутно полезен, чтобы увидеть, как будет выглядеть ваша форма, но даже тогда, ну, на самом деле, особенно если вы используете шаблоны данных, которые не привязаны к данным, доступным на время разработки. Если мне нужно отредактировать мой XAML, я беру его как человек и делаю это вручную.
Большая часть моего реального кода находится на C#, а не на XAML. Как я уже говорил, elsewhere, полностью исключая тот факт, что я еще не привык к «мышлению» в нем, XAML поражает меня как неуклюжий, уродливый язык, который также случается с плохой поддержкой дизайнера и intellisense, и что нельзя отлаживать. Uggh. Следовательно, всякий раз, когда я могу ясно видеть, как сделать что-то в коде C#, я не могу легко увидеть, как это сделать в XAML, я делаю это на C#, не извиняясь.Там было много написано о том, как хорошая практика почти никогда не использовать код на странице WPF (скажем, для обработки событий), но по крайней мере, по крайней мере, это не имеет для меня никакого смысла. Почему я должен что-то делать с уродливым, неуклюжим языком с ужасным синтаксисом, ужасно плохим редактором и практически без безопасности типа, когда я могу использовать хороший, чистый язык, такой как C#, который имеет редактор мирового класса, почти идеально intellisense и безопасность беспрецедентного типа?
Так вот, где я нахожусь. Какие-либо предложения? Я пропустил какие-то большие части этого? Что-нибудь, что я действительно должен думать о том, чтобы делать по-другому?
vs2010/fw4.0: кажется, что ItemsSource должен быть привязан к familyCVS.View (вместо familyCVS) –