Template10 PageHeader文本绑定异常

时间:2016-04-25 12:21:00

标签: win-universal-app xamlparseexception uwp-xaml template10

我正在使用Template10作为我的UWP应用程序,我想动态更新页面标题文本。这是我的XAML,

        <controls:PageHeader x:Name="pageHeader" Text="{Binding ViewModel.Title}">
            <!--place stretched, across top-->
            <RelativePanel.AlignTopWithPanel>True</RelativePanel.AlignTopWithPanel>
            <RelativePanel.AlignRightWithPanel>True</RelativePanel.AlignRightWithPanel>
            <RelativePanel.AlignLeftWithPanel>True</RelativePanel.AlignLeftWithPanel>
        </controls:PageHeader>

以下是异常消息

WinRT information: Failed to assign to property 'Template10.Controls.PageHeader.Text'. [Line: 57 Position: 73]

Additional information: The text associated with this error code could not be found.

Failed to assign to property 'Template10.Controls.PageHeader.Text'. [Line: 57 Position: 73]

没有绑定它完美地工作,但我需要动态地改变它,任何想法/解决方法?感谢。

2 个答案:

答案 0 :(得分:0)

我发现了问题,而不是绑定我使用x:Bind,但除了性能之外应该没有区别,仍然需要理解为什么......

Text =“{x:Bind ViewModel.Title}”&gt;

答案 1 :(得分:0)

如果你还没有解决这个问题(已经有一段时间了),这就是你应该做的。

首先,确保在XAML页面或代码隐藏页面中定义了ViewModel。

<Page.DataContext>
    <vm:ViewModelPage x:Name="ViewModel" />
</Page.DataContext>

vm 是您的ViewModel的名称空间(例如,MyAppProject.ViewModels),如下面顶部的名称空间声明中定义的那样:

xmlns:vm="using:MyAppProject.ViewModels"

ViewModelPage 是包含标题属性的ViewModel类型页面。

同样可以在视图页面代码隐藏中定义,如下所示(但更喜欢XAML,因为它在你的绑定中更具可读性)

public ViewModelPage ViewModel => this.DataContext as ViewModelPage ;

您需要将ViewModel的使用命名空间声明放在代码隐藏的顶部(实际上是您在XAML页面中为 vm 所做的)。 / p>

正确完成 ViewModel 定义,您不应该找到&#34; ...找不到&#34; 错误。

现在进行绑定:使用 x:Bind ,因为它比传统绑定有所改进。请参阅我的回答here explaining the advantages of x:Bind要记住的一个重要事项是将绑定模式设置为&#34; OneWay&#34; (或&#34; TwoWay&#34;如果这适用于某些情况,例如更新TextBox),而不是将其保留为默认值&#34; OneTime&#34;如果缺少模式定义。

最后但同样重要的是,确保标题属性引发PropertyChanged事件以更新绑定(如果您动态更改标题)。 ViewModel页面应该很好地适应这一点:如果你遵循模板10 模式,ViewModel页面派生自 ViewModelBase ,属性可以访问 RaisePropertyChanged 方法调用,因此您的标题属性应如下所示:

private string _title;
public string Title
{
    get { return _title; }
    set { _title = value; RaisePropertyChanged(nameof(Title)); }
}

RaisePropertyChanged 可以使用不同的方法名称,例如 Set SetProperty 。对不起,如果这有点晚了,但希望有所帮助。