Поскольку вы не должны использовать дескрипторы ожидания или что-то подобное в потоке пользовательского интерфейса. Вам нужно будет синхронизировать два метода с помощью флагов в вашей модели представления и проверить их перед тем, как продолжить.
Итак, реализуйте два логических свойства в вашей модели представления. Теперь, когда диалог входа в систему завершен, задайте для одного из свойств (давайте назовем его IsLoggedIn) значение true, а когда последовательность инициализации закончится, вы установите для другого свойства (как насчет IsInitialized) значение true. Хитрость теперь заключается в реализации метода установки этих двух свойств:
#region [IsInitialized]
public const string IsInitializedPropertyName = "IsInitialized";
private bool _isInitialized = false;
public bool IsInitialized {
get {
return _isInitialized;
}
set {
if (_isInitialized == value)
return;
var oldValue = _isInitialized;
_isInitialized = value;
RaisePropertyChanged(IsInitializedPropertyName);
InitializationComplete();
}
}
#endregion
#region [IsLoggedIn]
public const string IsLoggedInPropertyName = "IsLoggedIn";
private bool _isLoggedIn = false;
public bool IsLoggedIn {
get {
return _isLoggedIn;
}
set {
if (_isLoggedIn == value)
return;
var oldValue = _isLoggedIn;
_isLoggedIn = value;
RaisePropertyChanged(IsLoggedInPropertyName);
InitializationComplete();
}
}
#endregion
public void InitializationComplete() {
if (!(this.IsInitialized && this.IsLoggedIn))
return;
// put your code here
}
В качестве альтернативы вы можете удалить InitializationComplete
из сеттеров и изменить InitializationComplete
на:
public void InitializationComplete() {
// put your code here
}
Затем подпишитесь на событие PropertyChanged, используя следующую реализацию:
private void Class1_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {
if (e.PropertyName == IsInitializedPropertyName || e.PropertyName == IsLoggedInPropertyName) {
if (this.IsInitialized && this.IsLoggedIn)
InitializationComplete();
}
}