c# - 在 Xamarin.Forms 中显示包含许多其他视图的视图的最佳方式
问题描述
我创建AddonPickerControl
了一个水平StackLayout
的视图AddonControls
。问题是包含AddonPickerListView
加载大约 2 秒的页面,它太长了。
我试图通过将插件绑定到 a 来获得相同的结果ListView
,但问题是每个单元格都必须有一个计数器来描述选择了多少特定插件。我不知道如何做到这一点ViewCell
,所以我决定StackLayout
。
public partial class AddonPickerControl : ContentView
{
public AddonPickerControl (AddonPicker addonPicker)
{
InitializeComponent ();
_addonPicker = addonPicker;
BindingContext = _addonPicker;
}
private readonly AddonPicker _addonPicker;
protected override void OnAppearing()
{
foreach (var addon in _addonPicker.AvailableAddons)
{
var addonControl = new AddonControl(addon);
addonControl.AddonPicked += OnAddonPicked;
AddonContainer.Children.Add(addonControl);
}
}
...
}
public partial class AddonControl : ContentView
{
public AddonControl (Addon addon)
{
InitializeComponent ();
_addon = addon;
this.BindingContext = _addon;
}
private readonly Addon _addon;
...
}
我应该如何显示AddonPickerControl
?填充StackLayout
其他视图需要太多时间。或者,也许可以创建一个ViewCell
计数器来描述已经选择了多少绑定的插件。
解决方案
这是一个示例,说明如何在列表视图中的每个项目中使用按钮来更新该项目的计数。
首先,这是一个简单的列表视图,其中包含一个带有 3 个标签和两个按钮的视图单元格:
<ListView x:Name="listView" ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal">
<Label Text="{Binding ItemName}" />
<Label Text="Count:" />
<Label Text="{Binding Count}" />
<Button Text="+" Command="{Binding BtnClickPlusCommand}" />
<Button Text="-" Command="{Binding BtnClickMinusCommand}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
然后在后面的代码中:
public partial class MainPage : ContentPage
{
public ObservableCollection<Item> Items { get; set; } = new ObservableCollection<Item>();
public MainPage()
{
InitializeComponent();
for (int i=1; i<11; i++)
{
Item item = new Item { ItemName = $"Item {i}", Count = "5" };
Items.Add(item);
}
BindingContext = this;
}
}
该类Item
将具有您的点击处理程序,并且是一个简单的视图模型,因为它实现了INotifyPropertyChanged
:
public class Item : INotifyPropertyChanged
{
public string ItemName { get; set; }
int _count;
public ICommand BtnClickPlusCommand { get; private set; }
public ICommand BtnClickMinusCommand { get; private set; }
public Item()
{
BtnClickPlusCommand = new Command(btnClickPlus);
BtnClickMinusCommand = new Command(btnClickMinus);
}
void btnClickPlus()
{
Count = (++_count).ToString();
}
void btnClickMinus()
{
Count = (--_count).ToString();
}
public string Count
{
get
{
return _count.ToString();
}
set
{
int j;
if (Int32.TryParse(value, out j))
{
_count = j;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count"));
}
else
Console.WriteLine("value could not be parsed to int");
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
因此,在这种情况下,我们实际上为每个项目创建了一个视图模型,因此我们可以拥有将处理与按钮关联的实际 Item 对象中的按钮单击的命令,因此我们只需要更新计数。并且使用绑定,UI 会自动更新为新的计数。结果:
推荐阅读
- nginx - Nginx 从 http 上的错误应用程序提供静态文件。它在 https 上正常工作
- javascript - Axios OAuth2 FastApi
- javascript - 有条件地将方法添加到 lodash 中的 _.chain()?
- javascript - 如果包含 Array 和 join(),则过滤值
- apache-spark - 如何使用 Hudi 转换器类(Spark 数据集)将字符串转换为 JSON?
- python - 如何使用 Pyqt5 TableWidget ItemChange 将更改保存到 .csv?
- python - ConvergenceWarning:Liblinear 无法收敛
- r - pdf() 设备中的重音字符宽度错误
- php - 我可以将值存储在一个变量中吗,该值在 php 标签之外
- python - 如何使用通配符和 .txt 文件中的唯一 ID 列表从文件夹中删除多个图像?