2016-08-14 4 views
3

Ich habe folgende XAML meiner Ansicht nach Modell auf einen Löschbefehl zu binden arbeiten:Xamarin Forms XAML ContextAction zu C# Bindung in ViewCell

 <TextCell.ContextActions> 
      <MenuItem Command="{Binding Path=BindingContext.DeleteCollectionCommand, Source={x:Reference Name=CollectionListView}}" 
        CommandParameter="{Binding .}" 
        Text="Delete" 
        IsDestructive="True" /> 
     </TextCell.ContextActions> 

Ich versuche, es zu C# zu konvertieren, so kann ich programmatisch verwenden es.

Ich habe Folgendes versucht, aber es funktioniert nicht. Was muss geändert werden? Gibt es eine bessere/andere Möglichkeit, auf das ViewModel DeleteCommand zuzugreifen?

protected override void OnBindingContextChanged() 
    { 
     base.OnBindingContextChanged(); 

     var deleteAction = new MenuItem { Text = "Delete", IsDestructive = true }; // red background 
     deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding(".")); 
     deleteAction.SetBinding(MenuItem.CommandProperty, 
      new Binding("BindingContext.DeleteCommand", BindingMode.Default, null, null, null, "{x:Reference Name=CollectionBeerListView}")); 

     ContextActions.Add(deleteAction); 
    } 

EDIT

ich in der Lage war, diese Funktion zu erhalten, indem skar Antwort und Initialisieren der Zelle wie dies von der übergeordneten Ansicht kombiniert:

 lstView.ItemTemplate = new DataTemplate(() => 
     { 
      var cell = new DeleteGenericListItemTemplate(page); 
      return cell; 
     }); 

nicht sicher, ob dies ideal ist. aber hält mich in Bewegung.

+1

Nun, ich tun nicht wissen, wie man einen verbindlichen Wurf macht C# mit Xaml ist viel einfacher und direkter und ich muss sagen, das ist die seltsamste Bindung, die ich gesehen habe. Ich kann Ihnen mit dem zweiten Teil Ihrer Frage helfen. Um die Eigenschaft, die Sie im Viewmodel benötigen, zu erreichen, müssen Sie BindingContext = new (your_ViewModel) setzen. Wenn Sie dies tun, können Sie leichter daran binden. Können Sie mehr vom Codebehind und vom Xaml teilen, damit wir Ihnen besser helfen können. Noch eine Frage, warum willst du es mit C# anstelle von Xaml machen? – BraveHeart

+0

Ich muss in der Lage sein, die Löschaktion programmatisch ein-/auszublenden, weshalb ich es von C# aus mache. Dies ist eine Generic-View-Zelle, die ich an mehreren Stellen verwende. – aherrick

+0

Ich muss auf den Befehl "Befehl löschen" des View-Modells aus dem Kontext einer bestimmten View-Zelle zugreifen. – aherrick

Antwort

1

, wenn Sie auf der Textzelle verlängern so etwas wie unten mit einem Verweis auf Ihre Seite erstellen sollten Sie in der Lage sein, Ihre DeleteCommand auf Ihrem Viewmodel durch die Bindung Kontext der Seite zuzugreifen:

public class CustomCell: TextCell 
{ 
     public CustomCell(Page page) 
     { 
      var deleteAction = new MenuItem { Text = "Delete", IsDestructive = true }; // red background 
      deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding(".")); 
      deleteButton.SetBinding (MenuItem.CommandProperty, new Binding ("BindingContext.DeleteCommand", source: page)); 
      ContextActions.Add(deleteAction); 


     } 
} 
+0

Danke für die Antwort. Muss ich das Objekt "Page" tatsächlich übergeben? Wenn ja, wie würde ich diese benutzerdefinierte Zelle von XAML aufrufen, die diese Variable übergibt? – aherrick

+0

müssten Sie Code verwenden, denke ich. Genau wie die neue Bearbeitung hast du deinen Beitrag eingestellt. – skar

Verwandte Themen