2009-04-24 12 views
8

Estoy planeando una aplicación de WPF queCómo crear formularios de entrada de datos dinámicos en una aplicación WPF?

  • ser capaz de crear entrada de datos dinámica forma (es decir, la forma obtiene los campos a mostrar, su orden, etc. de los datos en la base de datos, no desde el XAML)
  • utilizar el patrón MVVM si es posible

Aquí es cómo planeo ir al respecto: en un cliente de entrada de datos Ver I establecería el contexto de datos:

<UserControl.DataContext> 
    <vm:DynamicFormViewModel/> 
</UserControl.DataContext> 

y luego incluyen un elemento en mi XAML como un marcador para el formulario:

<UserControl.Content> 
    <view:DynamicFormView x:Name="CustomerEntry"/> 
</UserControl.Content> 

entonces en mi modelview quiero no tener propiedades estáticas, sino que quieren construir el XAML como uno construido HTML controla la espalda en ASP.NET, de esta manera:

View view = new View(); 
view.Children.Add(...) 

y de esta manera construir el Grid basado en la recopilación de datos (nombre, apellido) y metadatos (etiquetas de campo, nombre de campo, HelpText campo, campo de orden de visualización , etc.) que ViewModel obtiene del Modelo.

  • ¿Alguien ha creado una aplicación WPF que pueda crear formularios dinámicos de esta manera?
  • ¿usó el patrón MVVM?
  • ¿es posible utilizar el patrón MVVM de esta manera o el patrón MVVM presupone campos estáticos en el modelo de vista que están directamente vinculados a elementos estáticos en la vista?

Respuesta

7

Tendrá que escribir plantillas de datos para sus diversos tipos de datos de campo para que WPF elija cómo mostrar sus datos según su tipo. algo de este formato:

NOTA: Esto no es simplemente WPF pseudo código

<DataTemplate DataType="{x:Type DateTime}"> 
    <DatePicker Value="{Binding}"/> 
</DataTemplate> 
<DataTemplate DataType="{x:Type String}"> 
    <TextBox Text="{Binding}"/> 
</DataTemplate> 

No tiene que ser un tipo primitivo. Puede ser un tipo de clase Email, DateApproved o incluso Url. p.ej.

class Customer 
{ 
    public Email Email{get;set;} 
    public DateTime DateApproved{get;set;} 
    public URI Url{get;set;} 
} 

public class Email 
{ 
    public string Type{get;set;} 
    public string Value{get;set;} 
} 

.etc ...

actualización

Salida este ejemplo WPF dinámico interfaz de usuario en MSDN: Dynamic Data Entry with WPF and LINQ

+0

Correcto pero quiero incluir tipos personalizados como Correo electrónico, URL, Duración, Cliente para que cada uno tenga su propia validación. Estoy imaginando una base llamada llamada "CustomType", que todos estos tipos heredan y cada uno crea su propio método llamado p. IsValid() y displayAsXaml() etc. –

+0

Poner cosas en XAML para mí se siente estático. Recuerdo que en las aplicaciones ASP.NET, en casi todos los proyectos terminabas teniendo un pequeño Default.aspx con un par de controles que se creaban dinámicamente. De lo contrario, puede crear aplicaciones estáticas únicas que no pueden modificarse fácilmente. Supongo que para obtener esta naturaleza dinámica de WPF también tendrás una pequeña Window1.xaml y todo se creará dinámicamente de la misma manera. –

+0

Esta publicación parece ser antigua. Pero me gustaría hacer algo similar en WPF 4.0. El enlace al ejemplo de IU dinámica de WPF parece estar roto. ¿Alguien sabe otro ejemplo? –

1

Necesita configurar un DataTemplate para cada tipo de campo por ejemplo, Fecha, Cadena, Bool. Esto determinará cómo aparecerá cada campo.

Podría utilizar las columnas para una consulta de base de datos para generar una lista de objetos y colocarlos en un ItemsControl.

ObservableCollection<ColumnDef> columns = new ObservableCollection<ColumnDef>(); 

// Add columns from DB 
columns.Add(new StringColumnDef{Object=..., Field=..., Label=..., Value=...}); 
columns.Add(new DateColumnDef{Object=..., Field=..., Label=..., Value=...}); 

items.ItemsSource = columns; // items is an ItemsControl 

Cada elemento en el control del elemento se mostrará en función del DataTemplate para ese tipo.

Dentro de ColumnDef puede usar Reflection para actualizar el objeto de datos con cambios desde los controles de la interfaz de usuario. A continuación, puede aplicar los cambios a la ficha de datos cuando el usuario guarda.

Cuestiones relacionadas