MVVM - Просмотр загрузки и обработки событий - PullRequest
2 голосов
/ 08 октября 2011

В моем приложении для Windows Phone мне нужно отслеживать некоторые события, чтобы получить хороший поток. Но я не уверен, как правильно обращаться с ними.

Что нужно сделать при запуске приложения:

  • Главный вид загружен и создан соответствующий вид модели
  • В конструкторе модели представления я инициирую последовательность входа в систему, которая сигнализирует, когда завершается обработчиком событий

Теперь, когда последовательность входа в систему завершена И представление полностью загружено, мне нужно запустить другую последовательность. Но вот в чем проблема, порядок «завершения» этих двух событий не всегда одинаков ... Я использовал EventToCommand из MVVMLight, чтобы сигнализировать модель представления, что представление «загружено».

Любые мысли о том, как синхронизировать это.

1 Ответ

1 голос
/ 09 октября 2011

Поскольку вы не должны использовать дескрипторы ожидания или что-то подобное в потоке пользовательского интерфейса. Вам нужно будет синхронизировать два метода с помощью флагов в вашей модели представления и проверить их перед тем, как продолжить.

Итак, реализуйте два логических свойства в вашей модели представления. Теперь, когда диалог входа в систему завершен, задайте для одного из свойств (давайте назовем его 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();
    }
}
...