Я занимаюсь созданием своего первого реального приложения WPF (т.е. первого, предназначенного для использования кем-то, кроме меня), и я все еще обдумываю лучший способ сделать что-то в WPF. Это довольно простое приложение для доступа к данным, использующее еще довольно-таки новую Entity Framework, но мне не удалось найти много руководств в Интернете, чтобы наилучшим образом использовать эти две технологии (WPF и EF) вместе. Поэтому я подумал, что выброшу, как я подхожу к нему, и посмотрю, есть ли у кого-нибудь лучшие предложения.
-
Я использую Entity Framework с SQL Server 2008. EF поражает меня как намного сложнее, чем нужно, и еще не созрел, но Linq-to-SQL, по-видимому, мертв, поэтому я может также использовать технологию, на которую, как представляется, сосредоточена MS.
-
Это простое приложение, поэтому я (пока) не счел нужным создавать отдельный слой данных вокруг него. Когда я хочу получить данные, я использую довольно простые запросы Linq-to-Entity, обычно прямо из моего кода, например:
var families = from family in entities.Family.Include("Person") orderby family.PrimaryLastName, family.Tag select family;
-
Запросы Linq-to-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, я беру его как человек и делаю это вручную.
-
Большая часть моего реального кода находится на С#, а не на XAML. Как я уже упоминал в другом месте, полностью исключая тот факт, что я еще не привык к "размышлению" в нем, XAML поражает меня как неуклюжий, уродливый язык, который также случается с плохой поддержкой дизайнера и intellisense, и это невозможно отладить. Uggh. Следовательно, всякий раз, когда я могу ясно видеть, как сделать что-то в коде С#, я не могу легко увидеть, как это сделать в XAML, я делаю это на С#, не извиняясь. Было много написано о том, как хорошая практика почти никогда не использовать код на странице WPF (скажем, для обработки событий), но по крайней мере, по крайней мере, это не имеет для меня никакого смысла. Почему я должен что-то делать с уродливым, неуклюжим языком с ужасным синтаксисом, ужасно плохим редактором и практически без безопасности типа, когда я могу использовать хороший, чистый язык, такой как С#, который имеет редактор мирового класса, почти идеально intellisense и безопасность беспрецедентного типа?
Итак, где я нахожусь. Какие-либо предложения? Я пропустил какие-то большие части этого? Что-нибудь, о чем я действительно должен думать по-другому?