0

我正在为我的 UWP 应用程序使用 Template10,并且我想动态更新页眉文本。这是我的 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]

没有绑定它可以完美地工作,但我需要动态改变它,有什么想法/解决方法吗?谢谢。

4

2 回答 2

0

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

Text="{x:绑定 ViewModel.Title}">

于 2016-04-25T12:27:52.610 回答
0

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

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

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

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

xmlns:vm="using:MyAppProject.ViewModels"

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

可以在下面的视图页面代码隐藏中定义相同的内容(但更喜欢 XAML,因为它与您在那里的绑定一起更具可读性)

public ViewModelPage ViewModel => this.DataContext as ViewModelPage ;

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

正确完成ViewModel定义后,您不应收到“...无法找到”错误。

现在进行绑定:使用x:Bind因为它是对经典绑定的改进。请参阅我的回答,解释 x:Bind 的优点要记住的一件重要事情是将绑定模式设置为“OneWay”(或“TwoWay”,如果这适用于某些情况,例如更新 TextBox),而不是在缺少模式定义时将其保留为默认的“OneTime”。

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

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

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

于 2016-05-22T06:26:23.737 回答