Как построить формы ввода динамических данных в приложении WPF?

Я планирую приложение WPF, которое будет

  • уметь создать формы ввода динамических данных (это означает, что форма получает поля для отображения, их порядок и т. д. из данных в базе данных, а не из XAML)
  • используйте шаблон MVVM, если это возможно

вот как я планирую это сделать: в представлении ввода данных клиента я бы установил контекст данных:

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

а затем включить один элемент в мой XAML как заполнитель для формы:

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

затем в моем ModelView я хочу не иметь статических свойств, но я хочу построить XAML как один встроенный HTML-элементы управления обратно в ASP.NET, таким образом:

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

и таким образом построить сетку на основе сбора данных (firstname, lastname) и метаданных (метка поля, имя поля, поле helptext, порядок отображения поля и т.д.) который ViewModel получает от модели.

  • кто-нибудь построил WPF приложение, которое может создавать динамические формы таким образом?
  • вы использовали шаблон MVVM?
  • можно ли использовать шаблон MVVM таким образом или шаблон MVVM предполагает статические поля в модели представления, которые непосредственно связаны со статическими элементами в представлении?

2 ответов


вам придется писать шаблоны данных для различных типов данных полей, чтобы WPF выбирал способ отображения данных в зависимости от их типа. что-то из этого формата:

Примечание: это не WPF просто псевдо-код

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

это не обязательно должен быть примитивный тип. Это может быть Email, DateApproved или даже Url тип класса. например,

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;} 
} 

..так далее...

обновление

проверить это Пример динамического пользовательского интерфейса WPF на MSDN: динамический ввод данных с помощью WPF и LINQ


вам нужно настроить DataTemplate для каждого типа поля, например, дата, строка, Bool. Это определит, как будет выглядеть каждое поле.

затем вы можете использовать столбцы для запроса базы данных для создания списка объектов и размещения их в 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

каждый элемент в элементе управления элемента будет отображаться на основе DataTemplate для этого типа.

внутри ColumnDef вы можете использовать отражение для обновления объекта данных с изменениями из пользовательского интерфейса контроли. Затем можно применить изменения к базе данных при сохранении пользователем.