メインビューモデルのプロパティ "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);
}
}
です。それを動作させましたが、逆の方法です(設定ビューモデルからメインビューモデルのものを上げる –