Estoy en el proceso de crear mi primera aplicación WPF real (es decir, la primera destinada a ser utilizada por alguien más que yo), y todavía estoy volviendo mi cabeza la mejor manera de hacer cosas en WPF. Se trata de una aplicación de acceso a datos bastante sencilla que utiliza el aún bastante nuevo Entity Framework, pero no he podido encontrar mucha orientación en línea sobre la mejor manera de utilizar estas dos tecnologías (WPF y EF) juntas. Así que pensé en descartar cómo me estoy acercando, y ver si alguien tiene mejores sugerencias.Mejores prácticas para usar Entity Framework con WPF DataBinding
estoy usando Entity Framework con SQL Server 2008. La EF me parece a la vez mucho más complicado de lo que debe ser, y aún no está madura, pero LINQ to SQL es aparentemente muerto, por lo También podría usar la tecnología en la que MS parece enfocarse.
Esta es una aplicación simple, por lo que no he (todavía) visto apropiado para construir una capa de datos separada a su alrededor. Cuando quiero llegar a los datos, utilizo consultas bastante simples LINQ a la entidad, por lo general directamente de mi código subyacente, por ejemplo:
var families = from family in entities.Family.Include("Person") orderby family.PrimaryLastName, family.Tag select family;
LINQ-a-Entidad consultas devuelven un resultado IOrderedQueryable, que doesn 't refleja automáticamente los cambios en los datos subyacentes, por ejemplo, si agrego un nuevo registro a través de código para el modelo de datos de la entidad, la existencia de este nuevo registro no se refleja automáticamente en los diversos controles que hacen referencia a la consulta Linq. En consecuencia, estoy lanzando los resultados de estas consultas en un ObservableCollection, para captar los cambios de datos subyacentes:
familyOC = new ObservableCollection<Family>(families.ToList());
que a continuación en el mapa los ObservableCollection a un CollectionViewSource, de modo que pueda hacer funcionar el filtrado, clasificación, etc., sin tener que volver a la base de datos.
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));
continuación Ato los diversos controles y para qué, no para que 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" />
Cuando necesito añadir o borrar registros/objetos, lo hago manualmente por lo tanto los datos de entidad modelo, y la ObservableCollection:
private void DeletePerson(Person person) { entities.DeleteObject(person); entities.SaveChanges(); personOC.Remove(person); }
general estoy usando StackPanel y DockPanel controles para posicionar elementos. A veces usaré una Grilla, pero parece difícil de mantener: si desea agregar una nueva fila a la parte superior de su grilla, debe tocar cada control directamente alojado en la grilla para indicarle que use una nueva línea. Uggh. (Microsoft nunca pareció tener el concepto DRY.)
Casi nunca utilizo el diseñador VS WPF para agregar, modificar o colocar controles. El diseñador de WPF que viene con VS es algo vagamente útil para ver cómo se verá tu formulario, pero incluso entonces, bueno, no realmente, especialmente si estás usando plantillas de datos que no son vinculantes para los datos que están disponibles en tiempo de diseño. Si necesito editar mi XAML, lo tomo como un hombre y lo hago de forma manual.
La mayor parte de mi código real está en C# en lugar de XAML. Como mencioné elsewhere, completamente aparte del hecho de que aún no estoy acostumbrado a "pensar" en él, XAML me parece un lenguaje desagradable y torpe, que también viene con un pobre soporte de diseñador y intellisense, y que no se puede depurar Uggh. En consecuencia, cada vez que puedo ver claramente cómo hacer algo en C# code-behind que no puedo ver fácilmente cómo hacerlo en XAML, lo hago en C#, sin disculpas.Se ha escrito mucho acerca de cómo es una buena práctica casi nunca usar código subyacente en la página WPF (por ejemplo, para el manejo de eventos), pero hasta ahora al menos, eso no tiene sentido para mí en absoluto. ¿Por qué debería hacer algo en un lenguaje feo y torpe con una sintaxis espantosa, un editor asombrosamente malo y prácticamente ningún tipo de seguridad, cuando puedo usar un lenguaje agradable y limpio como C# que tiene un editor de clase mundial, casi perfecto? Intellisense, y la seguridad de tipo sin precedentes?
Así que ahí es donde estoy. ¿Alguna sugerencia? ¿Me estoy perdiendo partes importantes de esto? ¿Algo que realmente debería pensar haciendo de manera diferente?
vs2010/fw4.0: parece que ItemsSource debe estar vinculado a familyCVS.View (en lugar de familyCVS) –