6

当您将对象分配给 Content 控件时,它将具体化适用于该分配对象的 Visual。有没有一种程序化的方式来实现相同的结果?我想用一个对象在 WPF 中调用一个函数并返回一个 Visual,其中在生成 Visual 时应用相同的逻辑,就好像您将对象提供给 Content 控件实例一样。

例如,如果我有一个 POCO 对象并将其分配给一个 Content 控件,并且恰好定义了一个适当的 DataTemplate,那么它将实现该模板以创建 Visual。我希望我的代码能够获取 POCO 对象并从 WPF 中取回 Visual。

有任何想法吗?

4

1 回答 1

9

使用 DataTemplate.LoadContent()。例子:

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

如果您为某个类型的所有实例定义了 DataTemplate(DataType={x:Type ...},但没有 x:Key="..."),那么您可以使用以下静态方法使用适当的 DataTemplate 创建内容. 如果未找到 DataTemplate,此方法还通过返回 TextBlock 来模拟 ContentControl。

/// <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;
}
于 2011-08-23T04:09:27.293 回答