2016-12-12 10 views
0

Xamarinフォーム(AndroidとiOSでテスト済み)にこの問題があります。XamarinフォームとTabGestureRecognizerがコマンドで起動しない

私はこのViewModelに(非常にシンプルな、唯一のコマンド)を使用し、このコードで

using System; 

using Xamarin.Forms; 

namespace BugTGR 
{ 
    public class PageMain : ContentPage 
    { 
     public PageMain() 
     { 
      PageMainViewModel vm = new PageMainViewModel(); 
      this.BindingContext = vm; 

      Label label1 = new Label{ Text = "Press with ICommand"}; 

      TapGestureRecognizer tgr = new TapGestureRecognizer(); 
      tgr.BindingContext = vm; 
      tgr.SetBinding(TapGestureRecognizer.CommandProperty, "Tapped"); 
      label1.GestureRecognizers.Add(tgr); 

      Label label2 = new Label { Text = "Press with Tapped"}; 
      TapGestureRecognizer tgr1 = new TapGestureRecognizer(); 
      tgr1.Tapped += async (object sender, EventArgs e) => { 
       await DisplayAlert("Attention", "PRESSED WITH TAPPED", "Ok"); 
      }; 
      label2.GestureRecognizers.Add(tgr1); 

      Content = new StackLayout 
      { 

       Children = {label1, label2} 
      }; 
     } 
    } 
} 

単純なページを持っている

using System; 
using System.Windows.Input; 
using Xamarin.Forms; 
using PropertyChanged; 
namespace BugTGR 
{ 
    [ImplementPropertyChanged] 
    public class PageMainViewModel 
    { 
     public PageMainViewModel() 
     { 

      this.Tapped = new Command(async() => 
      { 
       await Application.Current.MainPage.DisplayAlert("Attention", "Pressed", "Ok"); 
      }); 

     } 

     public ICommand Tapped { protected get; set;} 
    } 
} 

次に、あなたが見ることができますどのように、私はバインドにしてみてくださいコマンドをTapGestureRecognizerに送り、ラベルにTGRを追加しますが、ラベルをクリックしてもコマンドは呼び出されません。

2番目のラベル(label2)に、Tappedイベントを使用して、コマンドをバインドせずに別のTapGestureRecognizerを追加します。これは動作します!

私に間違っていることを教えてくれる人がいますか?

ありがとうございます! アレッサンドロ

+0

まだ問題は表示されません。何がうまくいかず、どのプラットフォームでこれをテストしていますか?また、Xamarin.Formsのバージョンが最新であることを確認してください。 – therealjohn

+0

@therealjohn私はAndroidとiOSでテストしました。私は最後のXFバージョンを使用しています。私は他の研究をします –

+0

私はそれを考え出しましたが、私ができる前に投稿したように見えます。 :) – therealjohn

答えて

2

ここでは解決策があります。問題は、タップコマンドの作成方法です。 これを行うには2つの方法があります。 VMを呼び出すコマンドまたはイベントハンドラ。 XAMLでのコードでこれを行うとされていない場合、私はまた、あなたがtgr.BindingContext = VMを設定する必要はありませんvm.TappedHandler方法

namespace ButtonRendererDemo 
{ 
    public class LabelTapPage : ContentPage 
    { 
     public LabelTapPage() 
     { 
      PageMainViewModel vm = new PageMainViewModel(); 
      this.BindingContext = vm; 

      Label label1 = new Label { Text = "Press with ICommand" }; 
      TapGestureRecognizer tgr = new TapGestureRecognizer(); 
      label1.GestureRecognizers.Add(tgr); 
      tgr.SetBinding(TapGestureRecognizer.CommandProperty, "Tapped"); 

      Label label2 = new Label { Text = "Press with Tapped Event" }; 
      TapGestureRecognizer tgr1 = new TapGestureRecognizer(); 
      tgr1.Tapped += async (object sender, EventArgs e) => { 
       await DisplayAlert("Attention", "Tapped Event: Pressed", "Ok"); 
      }; 
      label2.GestureRecognizers.Add(tgr1); 

      Label label3 = new Label { Text = "Press with TappedHandler" }; 
      var tapGestureRecognizer = new TapGestureRecognizer(); 
      tapGestureRecognizer.Tapped += async (s, e) => { 
       await vm.TappedHandler(); 
      }; 
      label3.GestureRecognizers.Add(tapGestureRecognizer); 


      Content = new StackLayout 
      { 

       Children = { label1, label2, label3 } 
      }; 
     } 
    } 


    public class PageMainViewModel : INotifyPropertyChanged 
    { 
     ICommand tapCommand; 

     public PageMainViewModel() 
     { 
      tapCommand = new Command(OnTapped); 
     } 

     public async Task TappedHandler() 
     { 
      await Application.Current.MainPage.DisplayAlert("Attention", "TappedHandler: Pressed", "Ok"); 
     } 


     public ICommand Tapped 
     { 
      get { return tapCommand; } 
     } 

     async void OnTapped(object s) 
     { 
      await Application.Current.MainPage.DisplayAlert("Attention", "Tapped Command: Pressed", "Ok"); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 

} 

を使用します。

public ICommand Tapped { get; set; } 

に「保護」

削除ので、ページがアクセスすることができます:私はそこにはるかに簡単に解決策があることが判明し、それを公開した後、それはあなたのページで

を継承しています。それはそれです:-)

あなたは "set"が保護されていないことを意味するかもしれませんか?

+0

はい、セットは "保護されている"必要があります!ありがとう! –

関連する問題