MvvM Light:来自Event的Messenger

时间:2012-05-23 07:57:21

标签: c# wpf mvvm-light

我正在开发一个基于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);
        }
    }  
}

所以我想念一下这里的东西吗? 请有人帮帮我吗?

问候

1 个答案:

答案 0 :(得分:1)

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

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