1

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

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

问候

4

1 回答 1

1

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

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

于 2012-05-23T08:10:42.533 回答