【问题标题】:MVVM - View loading and eventhandlingMVVM - 查看加载和事件处理
【发布时间】:2023-03-07 13:09:01
【问题描述】:

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

应用启动时需要做什么:

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

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

关于如何同步的任何想法。

【问题讨论】:

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


    【解决方案1】:

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

    因此,在您的视图模型中实现两个布尔属性。现在,当登录对话框完成时,将其中一个属性(我们称之为 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();
        }
    }
    

    【讨论】:

    • Obalix 我要试试这个 :) 如果它有效,我会告诉你的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多