2017-10-06 1 views
0

私はListViewというビューを持っています。今度はListViewViewCell btwのカスタムレンダラー)のためにcustom rendererに切り替えました。シミュレータ(iOS、Android)でアプリを起動すると、次の例外が発生します。ListViewRendererでCachingStrategyを使用すると、プロパティーエラーが発生します

Xamarin.Forms.Xaml.XamlParseException:位置12:13私は削除する場合CachingStrategyすべてが正常に動作するようです値とプロパティ

間にプロパティが存在しない、または割り当て可能でない場合、または不一致の種類:プロパティ「CachingStrategy」を割り当てることができません。ここに私のコードは次のとおりです。ListViewが上に置かれている

ビュー、:

<StackLayout xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="MyApp.Views.SomeView" 
      xmlns:customViews="clr-namespace:MyApp.Views;assembly=MyApp" 
      xmlns:renderer="clr-namespace:MyApp.CustomRenderers;assembly=MyApp" 
      VerticalOptions="FillAndExpand"> 

    <renderer:CustomListView x:Name="SomeList" 
      SeparatorColor="{StaticResource PrimaryLight}" 
      HasUnevenRows="True" 
      CachingStrategy="RecycleElement" 
      IsGroupingEnabled="True" 
      GroupDisplayBinding="{Binding Key}" 
      IsPullToRefreshEnabled="True" 
      RefreshCommand="{Binding LoadDocumentsCommand}" 
      IsRefreshing="{Binding IsBusy, Mode=OneWay}"> 
    <ListView.GroupHeaderTemplate> 
     <DataTemplate> 
     <customViews:GroupingHeader/> 
     </DataTemplate> 
    </ListView.GroupHeaderTemplate> 

    <ListView.ItemTemplate> 
     <DataTemplate> 
     <customViews:MyListItem Clicked="Item_Clicked"/> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
    </renderer:CustomListView> 

</StackLayout> 

CustomListView

namespace MyApp.CustomRenderers 
{ 
    public class CustomListView : ListView 
    { 
    } 
} 

CustomListViewRenderer

[assembly: ExportRenderer(typeof(MyApp.CustomRenderers.CustomListView), typeof(MyApp.iOS.CustomRenderers.CustomListViewRenderer))] 
namespace MyApp.iOS.CustomRenderers 
{ 
    public class CustomListViewRenderer : ListViewRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<ListView> e) 
     { 
      base.OnElementChanged(e); 

      if (this.Control != null) 
      { 
       var listView = (UITableView)this.Control; 
       if (listView != null) 
       { 
        listView.SeparatorInset = UIEdgeInsets.Zero; 
       } 
      } 
     } 
    } 
} 

は、私は、プロパティを複製するべきか、私は必要なのですか別のコンストラクタ?

答えて

1

CachingStrategyはバインド可能なプロパティではなく、XAML parser or build taskによって提供されるconstructor argumentであるため、このエラーが発生しています。

OPTION-1

これを回避するには、あなたがCachingStrategyを受け入れるようにコンストラクタを変更することができます。

public class CustomListView : ListView 
{ 
    public CustomListView(ListViewCachingStrategy cachingStrategy) : 
       base(cachingStrategy) 
    { 

    } 
} 

そして、コンストラクタの引数として、キャッシング戦略を指定するために、あなたのXAMLを変更します。

<renderer:CustomListView x:Name="SomeList" 
      HasUnevenRows="True" 
      IsGroupingEnabled="True" 
      GroupDisplayBinding="{Binding Key}" 
      IsPullToRefreshEnabled="True" 
      RefreshCommand="{Binding LoadDocumentsCommand}" 
      IsRefreshing="{Binding IsBusy, Mode=OneWay}"> 
    <x:Arguments> 
     <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy> 
    </x:Arguments> 
    <ListView.GroupHeaderTemplate> 
     <DataTemplate> 

オプション-2

ハックavailabがあります独自のパラメータ属性を作成することができます。しかし、XAMLコンパイルがオンの場合にのみ機能します。詳細here

+0

私はオプションを取った。 1、私は*ハック*を使用したくないからです。したがって、私はパラメータのないコンストラクタを追加しました。このコンストラクタは、既定値として 'RetainElement'を持つコンストラクタを呼び出します。誰かが 'x:Arguments'を使うのを忘れてしまっても、今は例外がありません。 – testing

関連する問題