2016-04-12 13 views
0

Ich habe eine Listenansicht mit einer Kontextaktion und möchte sie unter bestimmten Umständen deaktivieren.So verschieben Sie eine View Cell in eine eigene XAML-Datei in Xamarin Forms

Eine Antwort here schlägt vor, die Ansichtszelle in ihre eigene XAML-Datei zu verschieben und OnBindingContextChanged zu verwenden, um einzelne Kontextaktionen zu aktivieren oder zu deaktivieren.

Ich habe versucht, die Ansicht Zelle in eine Datei zu bewegen, die wie folgt aussieht:

<forms:ViewCell xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:forms="http://xamarin.com/schemas/2014/forms" 
      xmlns:userControls="clr-namespace:Fraedom.UserControls;assembly=Fraedom" 
      x:Class="Fraedom.UserControls.ApprovalTemplate"> 

<forms:ViewCell.ContextActions> 
    <forms:MenuItem Text="Approve" /> 
</forms:ViewCell.ContextActions> 

aber eine Fehlermeldung erhalten, wenn ich es aus der Listenansicht wie diese Referenz:

<ListView.ItemTemplate> 

    <DataTemplate> 
     <dataTemplates:ApprovalTemplate></dataTemplates:ApprovalTemplate> 
    </DataTemplate> 

</ListView.ItemTemplate> 

ich auch versucht, Verschieben Sie die Datenvorlage anstelle der Ansichtszelle, und versuchen Sie, beide in einer Inhaltsansicht zu umbrechen (was nicht möglich ist und auch keine Ansicht ist).

Irgendwelche Ideen? Hier

ist der Fehler:

System.NullReferenceExceptionObject reference not set to an instance of an object 
     at Xamarin.Forms.Platform.Android.Platform.UpdateGlobalContext (Xamarin.Forms.VisualElement view) [0x0000b] in <filename unknown>:0 
     at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00000] in <filename unknown>:0 
     at Xamarin.Forms.Platform.Android.ViewCellRenderer.GetCellCore (Xamarin.Forms.Cell item, Android.Views.View convertView, Android.Views.ViewGroup parent, Android.Content.Context context) [0x00058] in <filename unknown>:0 
     at Xamarin.Forms.Platform.Android.CellRenderer.GetCell (Xamarin.Forms.Cell item, Android.Views.View convertView, Android.Views.ViewGroup parent, Android.Content.Context context) [0x00045] in <filename unknown>:0 
     at Xamarin.Forms.Platform.Android.CellFactory.GetCell (Xamarin.Forms.Cell item, Android.Views.View convertView, Android.Views.ViewGroup parent, Android.Content.Context context, Xamarin.Forms.View view) [0x00023] in <filename unknown>:0 
     at Xamarin.Forms.Platform.Android.ListViewAdapter.GetView (Int32 position, Android.Views.View convertView, Android.Views.ViewGroup parent) [0x00193] in <filename unknown>:0 
     at Android.Widget.BaseAdapter.n_GetView_ILandroid_view_View_Landroid_view_ViewGroup_ (IntPtr jnienv, IntPtr native__this, Int32 position, IntPtr native_convertView, IntPtr native_parent) [0x0001a] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Android.Widget.BaseAdapter.cs:509 
     at (wrapper dynamic-method) System.Object:1c8a63a2-474e-436f-9097-a2380578ec91 (intptr,intptr,int,intptr,intptr) 

Antwort

0

Ein paar Dinge ...

Erstens brauchen Sie nicht das Haupt Forms XML-Namespace an Alias, wenn Sie es bereits als Standard etabliert haben Namensraum für das Dokument. Daher können Sie xmlns:forms="http://xamarin.com/schemas/2014/forms" aus dem Stammelement und alle Vorkommen des forms:-Präfix löschen.

Zweitens fehlt Ihnen das schließende Tag für Ihre benutzerdefinierte ViewCell XAML. Das ist wahrscheinlich Ihr Fehler, da es so aussieht, als ob der Zellaufblasprozess der Ort ist, an dem der Absturz stattfindet.

Ich denke, ich würde diese Zellenvorlage wahrscheinlich in ein Ressourcenwörterbuch einfügen, anstatt eine benutzerdefinierte Klasse dafür zu definieren. Sie können Ereignishandler weiterhin an Vorlagen anhängen, selbst wenn sie als Wörterbuchressourceneintrag definiert sind. Das setzt natürlich voraus, dass Sie die Vorlage erneut verwenden. Wenn Sie es nur in diesem einen ListView verwenden, sehe ich nicht wirklich, warum Sie es in eine andere Datei aufteilen würden.