2012-04-01 6 views
0

メインビューモデルのプロパティ "IsLoading"が作成されました。このプロパティがtrueに設定されていると、プログレスバーが表示されます。これまでのところとても良いコンポジットプロパティと内部ビューモデルプロパティへのバインドが呼び出されない

catchは、別のビューモデルを呼び出すコマンドを持っています(このコードは別のページの機能だからですが、私はメインビューモデルからショートカットすることもできます)

だから、私は先に行って、このような何かにメインプロパティを変更:だから

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); 
       } 
      } 
     } 

とXAML

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

、私がメインと言っていますビューモデルがロードされているとき、または設定ビューモデルがロードされているときにロードしています。 問題は、バインディングは、メインビューモデルのIsLoadingプロパティを設定するときにのみ機能し、内部のIsLoadingプロパティに設定すると反応しないことです。どちらも同じプロパティ名 "IsLoading"を持っています。それは検出されるべきではありませんか?例えば

、メインビューモデルで(簡単にするためにコマンドのほんの実行):

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

と設定内部

はモデルビュー:

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); 
      } 
     } 

答えて

0

あなたはMainViewModelさんを見ていますisLoadingプロパティを使用して、プログレスバーを表示するかどうかを決定します。 SilverlightはNotifyPropertyChangedイベントを使用して、特定のプロパティを再評価するタイミングを決定します。 SettingsViewModelのIsLoadingプロパティまたはMainViewModelのプロパティのいずれかを設定すると、そのViewModelのchangedEventのみが発生します。両方に対してChangedEventを発生させる必要があります。

Aはセッターの例では、多くのMVVMフレームワークを使用すると、右の作成した厳格な依存関係を作成することなく、クロスViewModelに通信を行うことが理想的であるメッセージングと呼ばれる機能を提供すること(公開されたメソッドに依存する)

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

注かもしれ修正しました今。グローバルに使用されるIsLoadingプロパティを使用することもできます。

+0

です。それを動作させましたが、逆の方法です(設定ビューモデルからメインビューモデルのものを上げる –

関連する問題