2011-08-23 20 views
6

Khi bạn gán một đối tượng cho một điều khiển Nội dung, nó sẽ hiện thực hóa một Visual phù hợp với đối tượng được gán đó. Có cách nào có lập trình để đạt được kết quả tương tự không? Tôi muốn gọi một hàm trong WPF với một đối tượng và lấy lại một Visual, trong đó cùng một logic được áp dụng trong việc tạo ra Visual như thể bạn đã cung cấp đối tượng cho một cá thể kiểm soát nội dung.WPF - Làm thế nào để lập trình vật chất hóa đối tượng thành nội dung trực quan?

Ví dụ, nếu tôi có đối tượng POCO và gán nó cho một điều khiển Nội dung và có một DataTemplate thích hợp được xác định thì nó sẽ tạo mẫu đó để tạo Visual. Tôi muốn mã của tôi để có thể lấy một đối tượng POCO và lấy lại từ WPF Visual.

Bất kỳ ý tưởng nào?

Trả lời

8

Sử dụng DataTemplate.LoadContent(). Ví dụ:

DataTemplate dataTemplate = this.Resources["MyDataTemplate"] as DataTemplate; 
FrameworkElement frameworkElement = dataTemplate.LoadContent() as FrameworkElement; 
frameworkElement.DataContext = myPOCOInstance; 

LayoutRoot.Children.Add(frameworkElement); 

http://msdn.microsoft.com/en-us/library/system.windows.frameworktemplate.loadcontent.aspx

Nếu bạn có một DataTemplate định nghĩa cho tất cả các trường của một loại (DataType = {x: Loại ...}, nhưng không có x: Key = "...") sau đó bạn có thể tạo nội dung bằng cách sử dụng DataTemplate thích hợp bằng cách sử dụng phương thức tĩnh sau. Phương thức này cũng mô phỏng ContentControl bằng cách trả về một TextBlock nếu không tìm thấy DataTemplate.

/// <summary> 
/// Create content for an object based on a DataType scoped DataTemplate 
/// </summary> 
/// <param name="sourceObject">Object to create the content from</param> 
/// <param name="resourceDictionary">ResourceDictionary to search for the DataTemplate</param> 
/// <returns>Returns the root element of the content</returns> 
public static FrameworkElement CreateFrameworkElementFromObject(object sourceObject, ResourceDictionary resourceDictionary) 
{ 
    // Find a DataTemplate defined for the DataType 
    DataTemplate dataTemplate = resourceDictionary[new DataTemplateKey(sourceObject.GetType())] as DataTemplate; 
    if (dataTemplate != null) 
    { 
     // Load the content for the DataTemplate 
     FrameworkElement frameworkElement = dataTemplate.LoadContent() as FrameworkElement; 

     // Set the DataContext of the loaded content to the supplied object 
     frameworkElement.DataContext = sourceObject; 

     // Return the content 
     return frameworkElement; 
    } 

    // Return a TextBlock if no DataTemplate is found for the source object data type 
    TextBlock textBlock = new TextBlock(); 
    Binding binding = new Binding(String.Empty); 
    binding.Source = sourceObject; 
    textBlock.SetBinding(TextBlock.TextProperty, binding); 
    return textBlock; 
} 
+0

Tôi muốn thứ gì đó hoạt động chính xác như lớp Nội dung. tức là tuân theo cùng một logic với chính Kiểm soát nội dung. Mã của bạn là tốt và sẽ tốt cho kịch bản DataTemplate. Nhưng có thể không có một DataTemplate được định nghĩa cho POCO của tôi. –

+0

Nếu không có DataTemplate phù hợp thì nó sẽ quay trở lại để tạo một TextBlock và sử dụng ToString() trên đối tượng POCO để xác định văn bản. –

+0

Đủ dễ dàng, tôi vừa cập nhật phương thức tạo TextBox thay vì trả về null nếu không tìm thấy DataTemplate. FYI - ContentControl sẽ hiển thị nội dung UIElement dưới dạng UIElement, do đó, không sử dụng phương pháp này nếu bạn đã có UIElement làm nội dung. –

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