2009-04-24 65 views
8

Tôi đang lên kế hoạch cho một ứng dụng WPF mà sẽLàm cách nào để tạo biểu mẫu nhập dữ liệu động trong ứng dụng WPF?

  • có thể tạo nhập dữ liệu động tạo (có nghĩa là hình thức được các lĩnh vực để hiển thị, trật tự của họ, vv từ dữ liệu trong cơ sở dữ liệu, không phải từ XAML)
  • sử dụng mô hình MVVM nếu có thể

Dưới đây là làm thế nào tôi có kế hoạch để đi về nó: trong một khách hàng nhập dữ liệu Xem tôi sẽ thiết lập bối cảnh dữ liệu:

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

và sau đó bao gồm một phần tử trong XAML của tôi như là một giữ chỗ cho các hình thức:

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

sau đó trong ModelView của tôi, tôi muốn không có đặc tính tĩnh nhưng tôi muốn xây dựng các XAML là một trong xây dựng HTML kiểm soát trở lại trong ASP.NET, theo cách này:

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

và theo cách này xây dựng lưới điện dựa trên việc thu thập dữ liệu (firstname, lastname) và dữ liệu meta (nhãn trường, tên trường, helptext lĩnh vực, lĩnh vực thứ tự hiển thị , vv) mà ViewModel nhận được từ Mô hình.

  • có ai đã tạo ứng dụng WPF có thể tạo biểu mẫu động theo cách này không?
  • bạn có sử dụng mẫu MVVM không?
  • có thể sử dụng mẫu MVVM theo cách này hay không mô hình MVVM giả định các trường tĩnh trong Mô hình xem được liên kết trực tiếp với các phần tử tĩnh trong Chế độ xem?

Trả lời

7

Bạn sẽ phải viết mẫu dữ liệu cho các loại dữ liệu trường khác nhau để WPF sẽ chọn cách hiển thị dữ liệu của bạn tùy thuộc vào loại dữ liệu. một cái gì đó của định dạng này:

Chú ý: Đây không phải là WPF chỉ pseudo code

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

Nó không phải là một loại nguyên thủy. Nó có thể là Email, DateApproved hoặc thậm chí là loại lớp học Url. ví dụ.

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 ...

Cập nhật

Check-out này dụ WPF động UI trên MSDN: Dynamic Data Entry with WPF and LINQ

+0

Phải nhưng tôi muốn bao gồm các loại tùy chỉnh như Email, URL, Thời lượng, Khách hàng để mỗi loại sẽ phải có xác thực riêng. Tôi đang tưởng tượng một cơ sở được gọi là "CustomType" mà tất cả các loại này được kế thừa và mỗi loại được xây dựng theo phương pháp riêng của nó được gọi là e.g. IsValid() và displayAsXaml() vv –

+0

Đặt mọi thứ trong XAML cho tôi cảm thấy tĩnh. Tôi nhớ lại trong các ứng dụng ASP.NET, trong hầu hết các dự án bạn đã kết thúc có một chút Default.aspx với một vài điều khiển trong đó tất cả đều được tạo động. Nếu không, bạn tạo một lần, các ứng dụng tĩnh mà không thể thay đổi rất dễ dàng. Tôi cho rằng để có được tính năng động này của WPF, bạn cũng sẽ có một Window1.xaml nhỏ và sau đó eveyything được tạo động theo cùng một cách. –

+0

Bài đăng này có vẻ cũ. Nhưng tôi muốn làm một cái gì đó tương tự trong WPF 4.0. Liên kết đến ví dụ về giao diện người dùng động WPF dường như bị hỏng. Có ai biết một ví dụ khác không? –

1

Bạn cần phải thiết lập một DataTemplate đối với từng loại lĩnh vực ví dụ Ngày, Chuỗi, Bool. Điều này sẽ xác định cách mỗi trường sẽ xuất hiện.

Sau đó, bạn có thể sử dụng các cột cho truy vấn cơ sở dữ liệu để tạo danh sách đối tượng và đặt chúng vào một 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 

Mỗi mục trong mục điều khiển sẽ hiển thị dựa trên DataTemplate cho loại đó.

Bên trong ColumnDef, bạn có thể sử dụng Reflection để cập nhật đối tượng dữ liệu với các thay đổi từ các điều khiển giao diện người dùng. Sau đó, bạn có thể áp dụng các thay đổi cho databae khi người dùng lưu.

Các vấn đề liên quan