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;
}
Nguồn
2011-08-23 04:09:27
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. –
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. –
Đủ 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. –