我正在开发一个基于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);
}
}
}
所以我想念一下这里的东西吗? 请有人帮帮我吗?
问候
答案 0 :(得分:1)
您需要使用调度程序从非UI线程更新UI元素。从异步请求获得响应时执行的代码不在UI线程上。
http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher(v=vs.95).aspx