のクラス初期化した後、私は自分のアプリケーションが初期化され、メインウィンドウが表示された後、次の行のコードを実行したい:MVVM
if (System.IO.File.Exists("token"))
{
string[] startupStrings = Environment.GetCommandLineArgs();
await _myOneDrive.SilentLogIn();
IsActive = true;
if (startupStrings.Length > 1 && startupStrings[1] == "/a")
{
IsWorking = true;
IsActive = false;
await _myOneDrive.EjectSynchroProcedure(false);
IsActive = true;
IsWorking = false;
Application.Current.Shutdown();
}
}
私が使用できないため、残念ながら、私はこれを行うことができませんMVVMモデルコンストラクタのawait
オペレータLoaded
にサインアップすると、MVVMのアイデアが壊れてしまいます。 async void
を一般的に使用するのではなく、Event Handlerの論理的な同等物でのみ使用しています。だから私の非同期コマンドは次のようになります。
async void SilentLogin(object parameter)
{
await _myOneDrive.SilentLogin();
IsActive = true;
}
その後、私は私のコンストラクタでそれらを初期化し、XAMLコード内のボタンにコマンドをバインドします。
public MainWindowViewModel()
{
_myOneDrive = new MyOneDriveClient(PathPcDirectory, PathOneDriveDirectory, this);
LoginCommand = new RelayCommand(Login);
SilentLoginCommand = new RelayCommand(SilentLogin);
Console = "Program started";
}
それだけで正常に動作しますが、私はまだ初期化後のコードを実行しているの私の目標を達成することはできません。私はvoid
ではないのでasync void Login(object parameter)
コマンドを待つことができません。Task
です。さらに、RelayCommand
では有効ではないため、Task
に変更することはできません。だから、私はこのループの中で、実際にヒントやヒントを使ったり、間違いを指摘したりします。
ViewのLoadedイベントからViewModelの 'Initialize'メソッドを呼び出しても問題はありません。 MVVMに違反しているとは思わない。 – Euphoric
私は@ユーフォリックに同意します。ビュー_is_はVMについて知っています。それへのバインディングの表示と使用。 MVVMの目的は、VM _not_がそのプロパティがViewでどのように表現されるか心配することですが、ViewがVMの操作方法を知らないことを意味するものではありません。 – Sam
ありがとうございます。それは明らかにうまく動作します。私はコードビハインドを使わないように私の心を奪われましたが、より良い解決策であるようです。私は 'Dispatcher'を使って試しましたが、早く始まりました。 – tweant