Как создать динамические формы ввода данных в приложении WPF? - PullRequest
8 голосов
/ 24 апреля 2009

Я планирую приложение 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(...)

и таким образом построить Грид на основе набора данных (имя, фамилия) и метаданных (метка поля, имя поля, текст поля справки, порядок отображения поля и т. Д.), Которые ViewModel получает из модели. 1020 *

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

Ответы [ 2 ]

7 голосов
/ 24 апреля 2009

Вам нужно будет написать шаблоны данных для ваших различных типов данных поля, чтобы 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

1 голос
/ 24 апреля 2009

Вам необходимо настроить DataTemplate для каждого типа поля, например, Date, String, 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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...