ContentPresenter如何在UWP中工作?

时间:2016-05-30 21:06:25

标签: c# xaml uwp

我在设置一个简单的ContentPresenter时遇到了问题。

当我开始新的UWP项目时,请将MainPage内容更改为

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ContentPresenter Content="{Binding TheContent}" />
</Grid>

并将其代码设置为

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.DataContext = new ViewModel();
    }        
}

public class ViewModel
{
    public string TheContent { get { return "Hello World."; } }
}

我希望ContentPresenter只创建一个TextBlockText属性设置为“Hello World”。至少它在WPF中以这种方式工作。

相反,没有显示任何内容,我在输出中有一个Binding错误:

  

错误:BindingExpression路径错误:'Windows.Foundation.IReference`1'上找不到'TheContent'属性。 BindingExpression:   Path ='TheContent'DataItem ='Windows.Foundation.IReference`1';   target元素是'Windows.UI.Xaml.Controls.ContentPresenter'   (名称= '空'); target属性是'Content'(类型'Object')

在我看来,ContentPresenter尝试使用它所在的页面呈现它的内容? 当我明确地将ContentTemplate设置为TextBlock时,一切正常,但使用基于ContentTemplateSelector返回DataTemplate的{​​{1}},我有和以前一样的错误。

我错过了什么?

1 个答案:

答案 0 :(得分:4)

如果您没有创建模板,则应使用ContentControl ContentPresenter通常用作ControlTemplate ContentControl的一部分。

Referencing:

  

<强>说明

     

通常,您直接使用ContentPresenter   ControlTemplate的{​​{1}}标记内容的位置   出现了。

     

ContentControl通常用于将特征应用于文本   content,仅使用字符串设置为ContentPresenter属性   文本(或一些间接等价物,如Binding或RESX   资源)。出于这个原因,Content的属性是   类似于ContentPresenter类的属性。 (TextElement   class是几个不是控件的元素的基类   用于格式化可能出现在控件或布局中的文本   容器。)

说明

当您在TextElement的{​​{1}}中放置ContentPresenter时,它会自动显示模板化控件的内容。这意味着,如果将ControlTemplate的{​​{1}}设置为Button,则ContentControl的Content属性将隐式绑定到使用该TargetType的按钮的内容}。

要设置ControlTemplate属性的绑定,您可能需要考虑使用ContentPresenter属性。 ControlTemplate属性指向模板化父级上的属性,并自动为关联的模板和模板选择器属性别名。