C# ContentPresenter在UWP中是如何工作的?

C# ContentPresenter在UWP中是如何工作的?,c#,xaml,uwp,C#,Xaml,Uwp,让一个简单的ContentPresenter按照我的预期工作,我遇到了一个问题 当我启动一个新的UWP项目时,将主页内容更改为 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <ContentPresenter Content="{Binding TheContent}" /> </Grid> 我希望ContentPresenter只创建一个TextBlo

让一个简单的
ContentPresenter
按照我的预期工作,我遇到了一个问题

当我启动一个新的UWP项目时,将
主页
内容更改为

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ContentPresenter Content="{Binding TheContent}" />
</Grid>
我希望
ContentPresenter
只创建一个
TextBlock
,并将
Text
属性设置为“Hello World”。至少在WPF中是这样的

相反,没有显示任何内容,输出中有一个绑定错误:

错误:绑定表达式路径错误:“Windows”.Frime.Ic参考“1”上未找到“内容”属性。绑定表达式: 路径=“内容”数据项=“Windows .Frase.IcRead 1”; 目标元素是“Windows.UI.Xaml.Controls.ContentPresenter” (Name='null');目标属性为“内容”(类型为“对象”)

在我看来,
ContentPresenter
试图用它所在的页面呈现它的内容? 当我显式地将
ContentTemplate
设置为
TextBlock
时,一切正常,但使用基于
TextBlock
返回
DataTemplate
ContentTemplateSelector
,我的错误与以前相同


我遗漏了什么?

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

备注

通常,您可以直接在
ContentControl
ControlTemplate
,用于标记内容的位置 出现了

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

评论

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


为“代码>内容提示器< /代码>属性设置绑定,您可能需要考虑使用<代码>内容源< /代码>属性。
ContentSource
属性指向模板化父对象上的属性,并自动为关联的模板和模板选择器属性设置别名。

我对UWP的ContentPresenter有很多问题,直到我决定改为切换到ContentControl。我不知道它是否适合您的用例,但您应该尝试一下
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.DataContext = new ViewModel();
    }        
}

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