2016-05-26 4 views
-1

Я искал все остальные вопросы с той же проблемой. Но я не могу найти от них никакого решения.OnPropertyChanged() не работает в MVVM

OnPropertyChanged стреляет, но элемент управления не обновляется. Я использую Mahapps.Metro ProgressRing Control.

View Code

<controls:MetroWindow.Resources> 
     <userObj:LoginViewLogic x:Key="UserData"/> 
     <userObj:LoginViewLogic x:Key="LoginViewLogic"/> 
    </controls:MetroWindow.Resources> 

    <Grid> 
     <Canvas> 
      <controls:ProgressRing Name="ProgressRing" Canvas.Left="133" Canvas.Top="154" Height="50" Width="35" IsActive="{Binding Source={StaticResource UserData},Path=UserData.IsProgressRingActive}"/> 
     </Canvas> 
    </Grid> 

ViewModel Код

public class LoginViewLogic { 

    public LoginViewLogic() { 

     _userData = new User(AppSettings.ReadCredentials(),(bool)loadedSettings); 
    } 

    private User _userData; 
    public User UserData 
    { 
     get { return _userData; } 
     set { _userData = value; } 
    } 

    public async void Login() { 

     _userData.IsProgressRingActive = true; 
     var loginResult = await Stuff.Login(_userData); 

     if (!loginResult) { 
      MessageBox.Show("You have entered an invalid username or password", 
       "Information", MessageBoxButton.OK, MessageBoxImage.Error); 
      _userData.IsProgressRingActive = false; 
     } 
    } 

Код модели

public class User : INotifyPropertyChanged { 

     private bool _isProgressRingActive; 
     public bool IsProgressRingActive { 

      get { return _isProgressRingActive; } 
      set { 
       _isProgressRingActive = value; 
       OnPropertyChanged("IsProgressRingActive"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected virtual void OnPropertyChanged(string propertyName) { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 
+0

Отображается ли на вашем выходном окне какая-либо ошибка привязки? – M312V

+0

Вы уверены, что вы вызываете метод 'Login' на правильном экземпляре' LoginViewLogic'? У вас их два, может быть, когда вы привязываетесь к ресурсу UserData, вы вызываете метод на ресурсе 'LoginViewLogic'? По крайней мере, недостающая реализация 'INotifyPropertyChanged' в модели представления не является вашей проблемой (хотя это не повредит ее реализации). – Clemens

+0

Нет ошибки привязки, все остальные привязаны одинаково и работают. Я реализовал NotChanged в модели представления. –

ответ

-2

Ваш LoginViewLogic класс также необходимо реализовать INotifyPropertyChanged. Для того, чтобы OnPropertyChanged работал, INotifyPropertyChanged должен быть реализован во всей цепочке привязки. В этом случае вы привязываетесь к «Class.Property» с . Если вам нужно привязать к классу Class1.Class2.Property, то и Class1, и Class2 также должны реализовать INotifyPropertyChanged, а также конкретное свойство, к которому вы привязываетесь.

+0

Спасибо за ответ. Я реализовал теперь INotifyPropertyChanged в моем классе LoginViewLogic и изменил свойство UserData, но проблема все еще остается, я что-то пропустил? Я также хочу упомянуть, что мои View, Model и ViewModel находятся в отдельных проектах. –

+0

Это нарушает привязку полностью, он говорит, что can not resolve IsProgressRingActive –

+0

Можете ли вы поставить точку останова на свой конструктор 'LoginLogicView', чтобы убедиться, что объект создается? – jeff17237

-1

Ваш viewmodel также должен поднять PropertyChanged событие. Попробуйте использовать код ниже.

public class LoginViewLogic : INotifyPropertyChanged 
{ 
    public LoginViewLogic() 
    { 
     _userData = new User(AppSettings.ReadCredentials(),(bool)loadedSettings); 
    } 

    private User _userData; 
    public User UserData 
    { 
     get { return _userData; } 
     set { _userData = value; } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 

} 
+0

По-прежнему та же проблема. –

0

Вы пробовали это:

<controls:MetroWindow.Resources> 
     <userObj:LoginViewLogic x:Key="LoginViewLogic"/> 
    </controls:MetroWindow.Resources> 

    <Grid> 
     <Canvas> 
      <controls:ProgressRing Name="ProgressRing" Canvas.Left="133" Canvas.Top="154" Height="50" Width="35" IsActive="{Binding Source={StaticResource LoginViewLogic},Path=UserData.IsProgressRingActive}"/> 
     </Canvas> 
    </Grid> 

Таким образом, вы только создание и привязка к одному экземпляру класса LoginViewLogic?