从ViewModel绑定控件详细信息在xamarin.forms中花费较长时间用于ListView

时间:2019-01-22 04:10:26

标签: listview xamarin.forms

我正在使用xamarin.forms应用程序,在那里我有一个列表视图,其中包含11个堆栈布局以及每个stackLayout的不同设计。

此处,堆栈布局中所有控件的所有颜色和可视性都从viewModel绑定。

问题是在加载应用程序时,列表视图正在加载视图,但是从ViewModel绑定列表视图的设计大约需要10到30秒的时间。

<ListView x:Name="itemslist" ItemsSource="{Binding listViewItems}" CachingStrategy="RecycleElement" HasUnevenRows="true" SeparatorVisibility="None" HorizontalOptions="FillAndExpand" BackgroundColor="#e7ebee" ItemSelected="OnItemSelected">
                <ListView.ItemTemplate>
                    <DataTemplate>
                    <controls:CustomViewCell/>

                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

我的自定义viewCell如下结构:

<StackLayout>
   <StackLayout x:Name="Type1">
        <Frame>
              Combination of Buttons, pickers and editor
        </Frame>
     </StackLayout>
.........................................................
 <StackLayout x:Name="Type11">
        <Frame>
              Combination of Buttons, pickers and editor
        </Frame>
     </StackLayout>
</StackLayout>

此自定义视图单元由11个层叠布局组成,每个层叠布局均具有不同的设计。

有什么方法可以使设计快速加载以进行查看。 ]

1 个答案:

答案 0 :(得分:0)

你是对的。这不是最佳方法,因为在加载列表时,您实例化了许多对最终用户无用的可视元素。

这就是我要做的:

  1. 分隔ContentView中的每个视图
  2. 创建一个视图,以收集所有视图,但仅在必要时使视图完整 就像(您在这里不需要xaml)那样:

公共类ContentView1:ContentView {     公共ContentView1()     { ...     }

protected override void OnBindingContextChanged()
{
    base.OnBindingContextChanged();
    if (BindingContext is MyViewModel vm)
    {
        _vm = vm;
        vm.PropertyChanged += VmOnPropertyChanged;
    }

//如果_vm不为null,请不要忘记分离事件处理程序     }

private void VmOnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == nameof(MyViewModel.MyProperty))
    {
        switch (_vm.MyProperty)
        {
            case 1:
                Content = new View1();
                break;
            case 2:
                Content = new View2();
                break;
            [...]
        }
    }
}

}

那样,仅在需要时才将视图号“ n”设置为不变。