2016-09-10 8 views
0

私のViewModelでdelete objectコマンドを使用しています。コマンドはボタンにバインドされています。ここまでは順調ですね。ボタンをクリックすると、オブジェクトはdbから削除されます。さて、明らかに、これを検証する必要があるので、私はDisplayAlertを使って "あなたは本当に削除しますか?"ユーザに提供する。これは表示されますが、アイテムはボタンのクリックに関係なく削除されます。ユーザーが「はい」を選択した場合、ViewModelでコマンドを実行するしか方法を理解するのには苦労しています。Xamarinでdisplayalert検証後にViewModelコマンドを実行する方法

XAMLボタン:

<Button Text="Delete player" Command="{Binding DeleteCommand}" Clicked="DeletePlayerEvent"></Button> 

Clickedイベント:

private async void DeletePlayerEvent(object sender, EventArgs e) 
    { 
     bool answer = await DisplayAlert("Notification", "Are you sure you want to delete this player?", "Yes", "No"); 
     //if (answer == true)?????? 
     // { 
      //Can I run the command from here? 
     //} 
    } 

ViewModelにコマンド

public Command DeleteCommand 
    { 
     get 
     { 
      return new Command(async() => 
      { 
       var playerServices = new PlayerServices(); 
       await playerServices.DeletePlayerAsync(_Player.Id); 
      }); 
     } 
    } 

答えて

1

ここでの問題は、あなたがコマンドバインディングとイベントを一緒に加入してやっているということです。

これらは両方とも個別に起動されており、お互いに依存しません。あなたがそれらを一緒にアップ配線でき

一つの方法は、ユーザが

がで書かれていると仮定すると、(あなたのクリックイベントにDeleteCommandプロパティのホールドを取得するには「はい」を選択したときに、ボタンのクリックイベントからのViewModelのDeleteCommandのを呼び出すことですコードビハインドファイル):

var viewModel = this.BindingContext as YouViewModel 
viewModel.DeleteCommand.Execute(); 

+0

これは簡単な修正ですが、適切なMVVMの恩恵を受けるわけではありません。ビューモデルはビューのロジックを保持すると考えられ、ビューはプレゼンテーションのみにする必要があります。ダイアログが複数のビューモデルのプロパティに基づいて表示される必要がある場合、またはコマンドの実行が失敗した後(たとえば、もう一度やり直すなど)、想像してみてください。ビューロジックの半分がビューに表示され、単体テストできません。 – bryanbcook

+0

@bryanbcook - MVVMに多くのストレスを与えないでください。 Xamarinでは、ビューのコードの中でいくつかのことをやるべきです。それは犯罪ではありません。これは議論の余地のあるトピックであり、私はそれを避けるために戻っていくだろう。私はそれに立つつもりはありません。最もよく知られているXamarinの開発者(James)もそうしています。あなたは、Xamarin Evolve 2016で展示されているhttps://github.com/xamarinhq/app-evolveで同じものを探すことができます。間違っていると思われる場合は、そのレポのバグを開いて私にリンクを送ってくださいチャイムイン。私は詳細に話すことがうれしいです。 – Jsinh

+0

そして@bryanbcook - あなたは「クイック」修正よりもうまくいくようにするための提案/別の提案がありますか? – Jsinh

関連する問題