在我的Windows手机应用程序中,我需要跟踪一些事件以获得良好的流量。但我不确定如何按顺序处理它们。
启动应用时需要做什么:
现在当登录序列完成并且视图已完全加载时,我需要启动另一个序列。 但问题是这两个事件'完成'的顺序并不总是一样的...... 我使用MVVMLight的EventToCommand来发出视图已经“加载”的视图模型。
关于如何同步这一点的任何想法。
答案 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();
}
}