MvvM - Light ベースのアプリケーションを開発しています。このアプリケーションでは、非同期の HttpRequest を開始しました。次に、応答があったときにイベントを起動し、このイベントでメッセージをブロードキャストして別のビューに切り替えます。しかし、このコードを実行すると、InvalidOperation Exception が発生しました。別のスレッドが所有しているため、呼び出しスレッドはこのオブジェクトにアクセスできません。
これが私のコードです:
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);
}
}
}
ここで何か誤解していますか?誰でも私を助けてもらえますか?
ご挨拶