我正在使用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个层叠布局组成,每个层叠布局均具有不同的设计。
答案 0 :(得分:0)
你是对的。这不是最佳方法,因为在加载列表时,您实例化了许多对最终用户无用的可视元素。
这就是我要做的:
公共类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”设置为不变。