2013-09-08 4 views
2

세 개의 ViewModels가 있습니다. - MainViewModel, - NavigatorViewModel, - ProjectViewModel.두 개의 ViewModels에서 동일한 속성과 속성이 변경됨

public ProjectViewModel CurrentProject 
    { 
     get 
     { 
      return _currentProject; 
     } 
     set 
     { 
      if (_currentProject == value) 
      { 
       return; 
      } 
      _currentProject = value; 
      RaisePropertyChanged("CurrentProject"); 
     } 
    } 

NavigatorViewModel에서 내가 가진 또한 속성 CurrentProject 내가 MVVM 빛을 사용

public ProjectViewModel CurrentProject { get { return ViewModelLocator.DesktopStatic.CurrentProject; } } 

다음 MainViewModel에서

나는 유형 ProjectViewModel에서 CurrentProject라는 속성이 있습니다. MainViewModel의 CurrentProject 속성이 변경되면 View NavigatorView에 알림이 표시되지 않습니다.

NavigatorView가 속성이 변경되었다는 것을 어떻게 알 수 있습니까?

답변

0

디자인 문제로 정적 싱글 톤 패턴을 사용하지 않는 것이 좋습니다. Messenger 클래스를 사용하여 메시지를 보낼 수 있습니다.

그러나, 현재의 문제를 해결하기 위해 해당 속성의 싱글에 PropertyChanged 이벤트에 응답해야합니다

public class NavigatorViewModel : INotifyPropertyChanged 
{ 
    public NavigatorViewModel() 
    { 
     // Respond to the Singlton PropertyChanged events 
     ViewModelLocator.DesktopStatic.PropertyChanged += OnDesktopStaticPropertyChanged; 
    } 

    private void OnDesktopStaticPropertyChanged(object sender, PropertyChangedEventArgs args) 
    { 
     // Check which property changed 
     if (args.PropertyName == "CurrentProject") 
     { 
      // Assuming NavigatorViewModel also has this method 
      RaisePropertyChanged("CurrentProject"); 
     } 
    } 
} 

이 솔루션은 싱글 속성에 대한 변경 사항을 청취하고 리스너에 변화를 전파 NavigatorViewModel.

경고 : 어딘가에 NavigatorViewModel에서 이벤트를 언 후크해야하거나 메모리 누수가 발생할 수 있습니다.

ViewModelLocator.DesktopStatic.PropertyChanged -= OnDesktopStaticPropertyChanged; 
+0

대단히 감사합니다. 그것은 꽤 잘 작동합니다. 같은 방식으로 메신저를 사용하는 방법에 대한 기사가 있습니까? 나는 이것이 어떻게 작동하는지 상상할 수 없다. 필자는 View와 Viewmodel 사이의 메시징에서만 개인적으로 사용했습니다. 내가 메시지를 제출해야하는 부동산을 변경하면? – Kevin

+0

http://stackoverflow.com/questions/2911171/mvvm-light-messenger-class를 참조하십시오. –

+0

또한 도움이된다면 답을 해결책으로 표시하십시오. 건배. –

관련 문제