2015-08-28 2 views
0

enter image description here Я пытаюсь понять модель mvvm. Поэтому я следовал за этим учебником по YouTube: YoutubeVideoMVVM TextBlock не обновляет текст во время выполнения

У меня есть класс под названием Person. В первом текстовом поле представления вы можете вставить свое имя, а во втором - имя. Textblock должен автоматически обновляться с помощью свойства fullname, но это происходит только во время разработки, и я не знаю, почему.

Вот XAML из MainPage:

<Page 
x:Class="PropertyChanged.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:PropertyChanged" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:m="using:PropertyChanged.Models" 
mc:Ignorable="d"> 
<Page.Resources> 
    <m:Person x:Key="person"/> 
</Page.Resources> 
<Grid DataContext="{Binding Source={StaticResource person}}" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Width="Auto"> 
     <TextBox Text="{Binding Path=Name, Mode=TwoWay}"></TextBox> 
     <TextBox Text="{Binding Path=Lastname, Mode=TwoWay}"></TextBox> 
     <TextBlock Text="{Binding Path=Fullname}" Width="Auto"></TextBlock> 
    </StackPanel> 
</Grid> 

И мой Person класс в пространстве имен PropertyChanged.Models:

public class Person : INotifyPropertyChanged 
{ 
    private string name; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; 
      OnPropertyChanged("Name"); 
      OnPropertyChanged("FullName"); 
     } 
    } 

    private string lastname; 

    public string Lastname 
    { 
     get { return lastname; } 
     set { lastname = value; 
      OnPropertyChanged("Lastname"); 
      OnPropertyChanged("FullName"); 
     } 
    } 

    private string fullname; 

    public string Fullname 
    { 
     get { return name +" " +lastname; } 
     set { fullname = value; 
      OnPropertyChanged("Fullname"); 
     } 
    } 

    public Person() 
    { 
     if (DesignMode.DesignModeEnabled) 
     { 
      this.Name = "Matthias"; 
      this.Lastname = "Herrmann"; 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+5

Typo: 'OnPropertyChanged (« FullName »);' и свойство называется 'Fullname' с нижним регистром« n ». –

+1

Обратите внимание, что это хорошее место (и причина) для использования оператора 'nameof' вместо фактической строки. – BradleyDotNET

+0

О, ладно, спасибо, что это может быть логическая ошибка от меня –

ответ

0

Я должен забрать мой предыдущий ответ. Я протестировал код в своей системе, и он работает, он может изменить имена, и TextBlock был обновлен во время выполнения.

Единственное, у меня есть разный есть код для обнаружения активно ли время разработки:

 if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) 
     { 
      this.Name = "Matthias"; 
      this.Lastname = "Herrmann"; 
     } 

Однако я до сих пор не рекомендовал бы использовать StaticResource для объекта, который будет редактироваться во время выполнения.

Вы можете изменить свойства объекта во время выполнения и увидеть изменения в пользовательском интерфейсе из-за уведомления об изменении свойств, но вы не смогли повторно установить объект Person из-за характера StaticResource, это может ввести в заблуждение.

+1

Не уверен, что это правильно, контекст данных установлен на статический ресурс, но делает ли это прекращение свойств объекта из-за уведомления? – kidshaw

+0

@kidshaw Я согласен с тобой –

+0

Благодарим вас за то, что вы обновили свой ответ, но я все равно добавлю - статические ресурсы предпочтительнее, если вам не нужно менять экземпляр, как часто вам нужно это делать? Я не имею в виду установку контекста данных для нового объекта, я имею в виду повторную инициализацию связанного объекта. Просто оглядываясь, как вы это сделаете, и я уверен, что если вы доберетесь туда, ваш дизайн будет неправильным. Использование static - это более эффективная память для загрузки. – kidshaw

Смежные вопросы