0

Я использую Template10 для своего приложения UWP, и я хочу динамически обновлять текст заголовка страницы. Вот мой XAML,Template10 PageHeader Text Binding Exception

 <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

Проверьте * DataContext *, а также помните, что по умолчанию значение 'x: Bind' равно * OneTime *. – Romasz

ответ

0

Я нашел эту проблему, вместо привязки Я использовал х: Bind, но не должно быть разницы, кроме производительности, по-прежнему необходимо понять, почему ..

Text = "{х: Bind ViewModel .Title} ">

+0

Поскольку по умолчанию «Режим» x: Bind - «OneTime», вместо «OneWay», как Binding. –

0

Если вы еще не решили эту проблему уже (было какое-то время), вот что вам следует делать.

Во-первых, убедитесь, что ViewModel определен либо на странице XAML, либо на странице с кодом.

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

ут является является имен для ViewModel (например, MyAppProject.ViewModels), определенный, как показано ниже в декларациях пространства имен в верхней:

xmlns:vm="using:MyAppProject.ViewModels" 

в то время как ViewModelPage является страницу типа ViewModel, которая содержит Название.

То же самое можно определить в странице просмотра кода позади, как показано ниже (но предпочитают XAML как его более читаемым в сочетании с вами привязок в там)

public ViewModelPage ViewModel => this.DataContext as ViewModelPage ; 

Вы должны поставить используя пространство имен объявление ViewModel вверху кода в коде (в действительности вы сделали для vm на странице XAML).

С ViewModel определение сделано правильно, вы не должны получить «... не может быть найден» ошибка в.

Теперь для привязки: используйте x: Bind, потому что это улучшение по сравнению с классической привязкой. См. Мой ответ here explaining the advantages of x:Bind. Одна важная вещь помнить устанавливает обязательную режима к «OneWay» (или «TwoWay», если это применимо, в некоторых случаях, как обновление TextBox), а не оставить его по умолчанию «одноразового», если режима определения пропал, отсутствует.

И последнее, но не менее важное: убедитесь, что свойство Название вызывает событие PropertyChanged для обновления привязки (если вы изменяете название динамически).Страница ViewModel должна быть хорошо приспособлена для облегчения: если вы будете следовать шаблона 10 шаблону, страница ViewModel происходит от ViewModelBase и свойства имеют доступ к RaisePropertyChanged вызова метода, поэтому ваше право собственность должна выглядеть следующим образом:

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

Иное имя метода может быть использован для RaisePropertyChanged, такие как Набор или SetProperty. Извините, если это немного поздно, но надеюсь, что это поможет.