如何使用Xamarin.Forms中的XAML设置CachingStrategy的ListView子类化

lau*_*jpn 2 c# listview xamarin.forms

我在XAML文件中设置CachingStrategy自己ListView继承的子类的。

但是,由于CachingStrategy拥有一个私有的setter,并且由于它是Parameter在其构造函数之一中使用属性设置的,由于某种原因,该属性被声明为内部的且是密封的,因此似乎无法对a进行子类化ListView

生成以下编译器错误:

找不到“ CachingStrategy”的属性,可绑定属性或事件,或值和属性之间的类型不匹配。

这是故意的吗?该Parameter属性为内部属性的原因是什么,更重要的是,是否存在一种将a子类化的干净方法ListView

作为一种解决方法,我最终做了以下工作:

public class MyListView : ListView
{
    public new ListViewCachingStrategy CachingStrategy
    {
        get => base.CachingStrategy;
        set => GetType().BaseType.GetProperty(nameof(CachingStrategy))
                        .SetValue(this, value);
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*idS 7

可以继承ListView并从XAML设置缓存策略,但这并不简单。文档在这里:

https://developer.xamarin.com/guides/xamarin-forms/user-interface/listview/performance/#Setting_the_Caching_Strategy_in_a_Subclassed_ListView

重要的是必须将缓存策略传递到构造函数中,这可能就是为什么无法使用属性进行设置的原因。

从Xamarin文档中复制了用于继承ListView并从XAML使用的相关代码段:

public class CustomListView : ListView
{
  public CustomListView (ListViewCachingStrategy strategy) : base (strategy)
  {
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后在您的XAML中使用它:

<local:CustomListView>
  <x:Arguments>
    <ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
  </x:Arguments>
</local:CustomListView>
Run Code Online (Sandbox Code Playgroud)

可悲的是,它没有使用基类时的优雅。