我正在使用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]
没有绑定它完美地工作,但我需要动态地改变它,任何想法/解决方法?感谢。
答案 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 。对不起,如果这有点晚了,但希望有所帮助。