2017-06-11 3 views
0

Ich versuche, einen TapGestureRecognizer in einem Bild zu binden (wie gesehen here), aber der relative Icommand im ViewModel wird nicht ausgelöst. Ich benutze LightMVVM Framework.Xamarin Forms Image TapGestureRecognizer Befehl nicht aufgerufen

Hier ist mein Code:

<?xml version="1.0" encoding="utf-8" ?> 
<CarouselPage xmlns="http://xamarin.com/schemas/2014/forms" 
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
       x:Class="ZoccoloManager.Views.DetailsPage" 
       ItemsSource="{Binding Cows}"> 
    <CarouselPage.ItemTemplate> 
     <DataTemplate> 
      <ContentPage x:Name="DetailsPage"> 
       <RelativeLayout> 
        <Image x:Name="fl_left" 
          Source="zoccolo_leftside.png" 
          RelativeLayout.WidthConstraint= 
          "{ConstraintExpression Type=RelativeToParent, 
                Property=Width, 
                Factor=0.3 }" 
          RelativeLayout.HeightConstraint= 
          "{ConstraintExpression Type=RelativeToParent, 
                Property=Height, 
                Factor=0.3 }" 
          RelativeLayout.XConstraint = 
          "{ConstraintExpression Type=RelativeToParent, 
                Property=Width, 
                Factor=0.07}" 
          RelativeLayout.YConstraint = 
          "{ConstraintExpression Type=RelativeToParent, 
                Property=Height, 
                Factor=0.07}"> 
         <Image.GestureRecognizers> 
          <TapGestureRecognizer Command="{Binding Path=BindingContext.TapImageCommand, Source={x:Reference DetailsPage}}" /> 
         </Image.GestureRecognizers> 
        </Image> 
       </RelativeLayout> 
      </ContentPage> 
     </DataTemplate> 
    </CarouselPage.ItemTemplate> 
</CarouselPage> 

und im Ansichtsmodell:

public class DetailsViewModel : ViewModelBase 
{ 
    private readonly INavigationService _navigationService; 
    private IRepository _repository; 
    public ICommand TapImageCommand { get; private set; } 
    public ObservableCollection<Cow> Cows { get; set; } 

    public DetailsViewModel(INavigationService navigationService) 
    { 
     _repository = ServiceLocator.Current.GetInstance<IRepository>(); 
     Debug.WriteLine(DateTime.Now + ": Calling LoadCows"); 
     LoadCows(); 
     Debug.WriteLine(DateTime.Now + ": Called LoadCows"); 
     _navigationService = navigationService; 

     TapImageCommand = new Command(OpenPopup); 
    } 

    private async Task LoadCows() 
    { 
     Debug.WriteLine(DateTime.Now + ": Started execution LoadCows"); 
     await Task.Run(() => 
     { 
      Cows = new ObservableCollection<Cow>(); 
      foreach (var cow in _repository.GetCompany(0).Cows) 
      { 
       Cows.Add(cow); 
      } 
     }); 
     Debug.WriteLine(DateTime.Now + ": Finished execution LoadCows"); 
    } 

    private void OpenPopup() 
    { 
     Debug.WriteLine("Opening popup "); 
    } 
} 

Aller Last in Ordnung, aber es den Getter des ICommand TapImageCommand Debuggen nie aufgerufen wird. Die Bindung an die ObservableCollection funktioniert einwandfrei, ich habe die korrekte Anzahl an Seiten als Elemente in der Liste.

Was vermisse ich?

+0

überprüfen Sie Ihre verbindliche Ausdruck – Jason

+0

Können Sie das erklären? Ich habe auch versucht, den Befehl des TapGestureRecognizer zu "{Binding TapImageCommand}" CommandParameter = "1", aber das Ergebnis ist das gleiche –

+0

statt einen Befehl zu binden, versuchen Sie nur die Tapped-Event-Handler – Jason

Antwort

1

Ok, ich habe herausgefunden, was das Problem war. Der Source={x:Reference DetailsPage} stand in Konflikt mit dem Klassennamen in der XML-Namespacedefinition. Das Hinzufügen einer richtigen x:Name in der Haupt-Tag-Karussell-Seite und die Verwendung des gleichen Namens in der Referenz, machte es gut funktioniert.

Verwandte Themen