2017-07-04 6 views
0

Mein Code ist wie folgt. Ich weiß nicht, ob der Befehl für das ToolbarItem korrekt implementiert ist. Es gibt keinen Fehler beim Kompilieren. Wenn auf den Baritem geklickt wird, passiert nichts.Toolbaritem in ToolBar nicht feuern wenn klicken

--- Xaml 

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"   
      xmlns:local ="clr-namespace:SembIWIS.View" 
      BackgroundColor="White" 
      Title="Repair and Service"   
      x:Class="MyMainMenu"> 
    <ContentPage.ToolbarItems> 
     <ToolbarItem Name="MenuItem1" Order="Primary" Icon="itemIcon1" Command="{Binding Item1Command}" Priority="0" /> 
     <ToolbarItem Name="MenuItem2" Order="Primary" Icon="itemIcon2" Priority="1" /> 
    </ContentPage.ToolbarItems> 

    <local:Product> 
    </local:Product> 

    <local:Service> 
    </local:Service> 

</TabbedPage> 


--------- Code Behind: 

public partial class MyMainMenu : TabbedPage 
    { 
     public ICommand Item1Command { get; private set; } 

     public MyMainMenu() 
     { 
      InitializeComponent(); 

      BindingContext = this; 

      NavigationPage.SetHasBackButton(this, true); 
      Init(); 
     } 

     private void Init() 
     { 

      this.Item1Command = new Command((sender) => 
      { 
       Navigation.PushAsync(new UpdateProduct()); 
      }); 


} 
+0

Sie haben den Bindungskontext für Ihre Ansicht nicht festgelegt, daher ist das 'Command =" {Binding Item1Command} "an nichts gebunden. Eine kurzfristige Problemumgehung besteht darin, den Bindungskontext im 'MyMainMenu'-Konstruktor festzulegen:' BindingContext = this; ', obwohl Sie möglicherweise das MVVM-Muster untersuchen und Ihr ViewModel in eine separate Klasse verschieben möchten, die nichts über die Benutzeroberfläche weiß. – Damian

+0

Dies geschieht auf der gleichen Seite. Kannst du mir freundlicherweise zeigen, wie und wo der Binding-Kontext hinzugefügt werden soll. – MilkBottle

+0

Ich habe meinen Kommentar aktualisiert, um zu erklären (ich habe vorzeitig Enter gedrückt). – Damian

Antwort

0

Aus den Kommentaren entnehme ich, dass Sie die BindingContext hinzuzufügen vergessen haben. Während du es jetzt hinzugefügt hast, ist das Timing falsch. Sie müssen die Methode Init(); ausführen, bevor Sie BindingContext einstellen.

Wenn die BindingContext eingestellt ist, ist an diesem Punkt alles verdrahtet und jede Änderung, die Sie vornehmen, wird nicht übernommen, es sei denn, Sie implementieren die INotifyPropertyChanged Schnittstelle korrekt. Wie auch immer, für dieses Problem, passen Sie den Code dazu:

public MyMainMenu() 
{ 
    InitializeComponent(); 

    NavigationPage.SetHasBackButton(this, true); 
    Init(); 

    BindingContext = this; 
} 

In Bezug auf Ihre Frage auf der Leistung und Unit-Tests im Kommentar:

Es gibt keinen Unterschied in der Leistung, weil welche auch immer MVVM Rahmen Sie verwenden werden führe diesen selben Code nur aus, es wird es automatisch machen. Wenn überhaupt, wird das MVVM-Framework wahrscheinlich etwas langsamer sein, da es wahrscheinlich Ihre ViewModels mit Reflektion oder ähnlichem auflösen wird. Wenn Sie Komponententests durchführen möchten, müssen Sie Ihren Code in ein separates ViewModel aufteilen und als BindingContext festlegen. Sehen Sie sich zum Beispiel blog post für die Verwendung von FreshMvvm mit separaten Views und ViewModels an.

+0

nur ein Gedanke. Vergleichen Sie diesen Ansatz mit der Mvvm-Bindung für den Befehl, was für den Komponententest einfacher ist? Gibt es Leistungsunterschiede? – MilkBottle

+0

Ich habe die Frage mit der Antwort darauf aktualisiert –

Verwandte Themen