1

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);
        }
    }  
}

ここで何か誤解していますか?誰でも私を助けてもらえますか?

ご挨拶

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 に答える