【问题标题】:MvvM Light: Messenger from EventMvvM Light:来自事件的信使
【发布时间】:2012-05-23 07:57:20
【问题描述】:

我正在开发一个 MvvM - 基于 Light 的应用程序。在这个应用程序中,我启动了一个异步 HttpReqest。然后,当我得到响应时,我启动了一个事件,在这种情况下,我正在广播一条消息以切换到另一个视图。但是当我执行这段代码时,我得到了一个 InvalidOperation 异常:调用线程无法访问这个对象,因为另一个线程拥有它。

这是我的代码:

public class MainLoginViewModel : ViewModelBase
{
    readonly LoginRequest _httpRequest = new LoginRequest();

    public MainLoginViewModel()
    {
        _httpRequest.IsValid += IsUserValid;
    }

    private void ExecuteLoginKeyPressCommand()
    {
        _httpRequest.BeginCheckIfUserIsValid();      
    }

    private static void IsUserValid(object sender, EventArgs e)
    {
        var infoView = new MainInfoView();

        if ((bool)sender)
        {
            infoView.Dispatcher.Invoke(DispatcherPriority.Normal,
                                   new Action(
                                       () => Messenger.Default.Send(infoView, Properties.Resources._mainLoginMessangerToken)));
        }
    } 
}

在这个类中,我定义了我的 LoginRequest 类来检查用户是否有效。该事件正在返回一个布尔值。如果用户有效,我将 Messenger 类中的新视图发送到另一个处理视图的 ViewModel:

public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
        SelectedView = new MainLoginView();
        Messenger.Default.Register<MainInfoView>(this, Properties.Resources._mainLoginMessangerToken, PasswordChanged);
    }

    private void PasswordChanged(MainInfoView obj)
    {
        SelectedView = obj;
    }       

    public UserControl SelectedView
    {
        get
        {
            return _selectedViewProperty;
        }

        set
        {
            if (_selectedViewProperty == value)
            {
                return;
            }

            var oldValue = _selectedViewProperty;
            _selectedViewProperty = value;
            RaisePropertyChanged(() => SelectedView, oldValue, value, true);
        }
    }  
}

所以我在这里误解了什么? 有人可以帮帮我吗?

问候

【问题讨论】:

    标签: c# wpf mvvm-light


    【解决方案1】:

    您需要使用调度程序从非 UI 线程更新 UI 元素。当您从异步请求获得响应时执行的代码不在 UI 线程上。

    http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher(v=vs.95).aspx

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      相关资源
      最近更新 更多