Я создал свойство "IsLoading" для моей модели основного вида. Идея состоит в том, что индикатор выполнения отображается всякий раз, когда это свойство имеет значение true Пока все хорошо
Суть в том, что у меня есть команда, которая вызывает другую модель представления (код есть, потому что это функциональность с другой страницы, но я хочу иметь возможность также ярлык на нее из моей основной модели представления)
Итак, я изменил основное свойство примерно так:
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);
}
}