2012-04-01 9 views
0

Ich habe eine Eigenschaft "IsLoading" für mein Hauptansichtsmodell erstellt. Die Idee ist, dass eine Fortschrittsleiste angezeigt wird, wenn diese Eigenschaft auf "True" gesetzt ist. So weit so gutComposite Bindung an Property und innere viewmodel -Eigenschaft nicht feuern

Der Haken ist, dass ich einen Befehl habe, der ein anderes Viewmodel aufruft (der Code ist da, weil es eine Funktionalität von einer anderen Seite ist, aber ich möchte es auch von meinem Hauptansichtsmodell abkürzen))

Also, ich gehe voran und die Haupteigenschaft zu so etwas wie dies geändert:

public const string IsLoadingPropertyName = "IsLoading"; 

     private bool _isLoading; 

     public bool IsLoading 
     { 
      get 
      { 
       return _isLoading || ((ViewModelLocator)Application.Current.Resources["Locator"]).SettingsViewModel.IsLoading; 
      } 
      set 
      { 
       if (value != _isLoading) 
       { 
        _isLoading = value; 
        RaisePropertyChanged(IsLoadingPropertyName); 
       } 
      } 
     } 

und dem xAML

<shell:SystemTray.ProgressIndicator> 
     <shell:ProgressIndicator IsIndeterminate="true" IsVisible="{Binding Main.IsLoading, Source={StaticResource Locator}}" /> 
    </shell:SystemTray.ProgressIndicator> 

Also, ich sage, dass Haupt Das Ansichtsmodell wird geladen, wenn dort etwas geladen wird oder wenn das Modell der Einstellungsansicht geladen wird. Das Problem ist, dass die Bindung funktioniert nur beim Festlegen der IsLoading -Eigenschaft des Hauptansichtsmodells, reagiert es nicht, wenn ich es in der inneren IsLoading -Eigenschaft festlegen. Beide haben den gleichen Eigenschaftsnamen "IsLoading". Sollte es nicht entdeckt werden?

Zum Beispiel in Hauptansicht Modell (nur die Ausführung des Befehls der Einfachheit halber):

private void ExecuteRefreshCommand() 
    { 
     ViewModelLocator viewModelLocator = Application.Current.Resources["Locator"] as ViewModelLocator; 
     viewModelLocator.SettingsViewModel.GetCurrentLocationCommand.Execute(null); 
    } 

und in den Einstellungen Modell anzuzeigen:

public RelayCommand GetCurrentLocationCommand 
     { 
      get 
      { 
       Action getLocation =() => 
       { 
        if (!NetworkInterface.GetIsNetworkAvailable()) 
        { 
         return; 
        } 

        var watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default); 
        watcher.PositionChanged += WatcherPositionChanged; 
        IsLoading = true; // settings view model "IsLoading" propertychanged raising property 
        watcher.Start(); 
       }; 
       return new RelayCommand(getLocation); 
      } 
     } 

Antwort

0

Sie suchen die MainViewModel die bei IsLoading-Eigenschaft, um zu bestimmen, ob die Fortschrittsleiste angezeigt werden soll oder nicht. Silverlight verwendet das NotifyPropertyChanged-Ereignis, um zu bestimmen, wann eine bestimmte Eigenschaft neu bewertet werden muss. Wenn Sie entweder die IsLoading-Eigenschaft des SettingsViewModel oder die Eigenschaft des MainViewModels festlegen, wird das ChangedEvent für dieses ViewModel nur ausgelöst. Sie sollten das ChangedEvent für beide erhöhen.

Eine modifizierte Setter Beispiel könnte sein (abhängig von den exponierten Methoden)

set 
{ 
    if (value != _isLoading) 
    { 
     _isLoading = value; 
     RaisePropertyChanged(IsLoadingPropertyName); 
     ((ViewModelLocator)Application.Current.Resources["Locator"]).SettingsViewModel.RaisePropertyChanged(IsLoadingPropertyName); 
    } 
} 

Beachten Sie, dass viele MVVM Rahmen einer Funktionalität bieten genannt Messaging, die ohne die Schaffung der strengen Abhängigkeit Queransichtsmodell Kommunikation zu tun ist ideal Sie richtig erstellt jetzt. Alternativ können Sie eine global konsumierte IsLoading-Eigenschaft verwenden.

+0

Ich sehe. es funktioniert, aber es ist anders herum (heben Sie von den Einstellungen viewmodel das Haupt Viewmodel's –

Verwandte Themen