MVVM - 查看加载和事件处理

时间:2011-10-07 22:35:02

标签: windows-phone-7 event-handling mvvm-light

在我的Windows手机应用程序中,我需要跟踪一些事件以获得良好的流量。但我不确定如何按顺序处理它们。

启动应用时需要做什么:

  • 加载主视图并实例化相应的视图模型
  • 在视图模型的构造函数中,我启动一个登录序列,该序列在使用eventhandler
  • 完成时发出信号

现在当登录序列完成并且视图已完全加载时,我需要启动另一个序列。 但问题是这两个事件'完成'的顺序并不总是一样的...... 我使用MVVMLight的EventToCommand来发出视图已经“加载”的视图模型。

关于如何同步这一点的任何想法。

1 个答案:

答案 0 :(得分:1)

因为你不应该在UI线程上使用等待句柄或类似的东西。您必须使用视图模型中的标志同步这两个方法,并在进行之前检查它们。

因此,在视图模型中实现两个布尔属性。现在,当登录对话框完成时,将其中一个属性(让我们称之为IsLoggedIn)设置为true,并在初始化序列完成时将另一个属性(IsInitialized如何)设置为true。现在的诀窍在于实现这两个属性的setter:

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