2013-11-09 2 views
0

Я пытаюсь реализовать MVVM, но мое представление не обновляется при изменении модели представления. Это моя точка зрения модели:Как обновить представление при изменении модели представления в MVVM?

public class ViewModelDealDetails : INotifyPropertyChanged 
{ 
    private Deal selectedDeal; 

    public Deal SelectedDeal 
    { 
     get { return selectedDeal; } 
     set 
     { 
      selectedDeal = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

В моем XAML для зрения у меня есть это:

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
     <StackPanel> 
      <TextBlock Text="{Binding Path=SelectedDeal.Title, Mode=TwoWay}"></TextBlock> 
     </StackPanel> 
</Grid> 

Класс сделки:

public class Deal 
{ 
    private string title; 
    private float price; 

    public Deal() 
    { 
     this.title = "Example";  
    } 

    public Deal(string title, float price) 
    { 
     this.title = title; 
     this.price = price; 
    } 

    public string Title 
    { 
     get { return title; } 
     set { title = value; } 
    } 

    public float Price 
    { 
     get { return price; } 
     set { price = value; } 
    } 
} 

При запуске приложения значение правильное, но когда SelectedDeal изменяется, представление не работает. Что мне не хватает?

ответ

1

Путь вашего связывания nested.To сделать его работу, ваш класс Deal должен осуществлять INotifyPropertyChanged тоже. В противном случае он не будет запущен, если только SelectedDeal изменен. Я бы предложил вам сделать ваши модели просмотра все унаследованными от BindableBase. Это сделало бы вашу жизнь намного легче.

public class ViewModelDealDetails: BindableBase 
    { 
     private Deal selectedDeal; 

     public Deal SelectedDeal 
     { 
      get { return selectedDeal; } 
      set { SetProperty(ref selectedDeal, value); } 
     } 

    } 

    public class Deal: BindableBase 
    { 
     private string title; 

     public string Title 
     { 
      get { return title; } 
      set { SetProperty(ref title, value); } 
     } 
    } 

Приведенный выше код должен работать.

КСТАТИ: Если у вас нет доступа к коду класса Deal, то, чтобы вызвать связывание, вам придется воссоздать экземпляр SelectedDeal каждый раз, когда значение Заголовок изменяется.

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