在我的windows手机应用程序中,我需要跟踪一些事件以获得良好的流量。但我不确定如何按顺序处理它们。
应用启动时需要做什么:
- 加载主视图并实例化相应的视图模型
- 在视图模型的构造函数中,我启动了一个登录序列,该序列在完成时使用事件处理程序发出信号
现在,当登录序列已经完成,视图完全加载,我需要启动另一个序列。但问题是,这两个事件"完成"的顺序并不总是相同的……我使用了来自MVVMLight的EventToCommand来通知视图模型视图已经"加载"。
对如何同步这个有什么想法吗
因为你不应该在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();
}
}