我有一个带有动态添加项的ListView。列表中的每一行都包含一个标签,一个开关和一个按钮。仅在切换该ViewCell的“开关”时,相应的“按钮”才可见。相应的按钮还应该具有特定于列表中该项目的命令。我该如何实现?我正在使用MVVM模式。
<ListView HorizontalOptions="FillAndExpand" ItemsSource="{Binding SomeList}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout HorizontalOptions="FillAndExpand" Orientation="Horizontal">
<Label
HorizontalOptions="StartAndExpand"
Text="{Binding SomePropertyFromSomeList}"
VerticalOptions="Center" />
<Switch />
<Button
Command="{Binding DoSomethingSpecificToThisSwitch}"
IsVisible="{Binding VisibleWhenThisSwitchIsToggled}"
Text="{Binding AlsoDependentOnWhichSwitch}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
答案 0 :(得分:0)
我发现解决此问题的最佳方法是使用CommandParameter
并根据ViewModel
数据的上下文决定在ViewCell
中做什么。
如果使用Binding,则可以通过选择绑定到当前数据的整个上下文。 (点),这样会将当前ViewCell中的数据传递到您的ViewModel。
让我们展示一下如何编写此代码... 您的视图应如下图所示
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TestCommand"
x:Name="TestPage"
x:Class="TestCommand.MainPage">
<StackLayout>
<ListView ItemsSource="{Binding Persons}" RowHeight="50">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text="{Binding Name}" />
<Button Text="Click" Command="{Binding DoCommand, Source={x:Reference TestPage}}" CommandParameter="{Binding .}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
请注意,您需要为页面提供一个名称!这样,您可以在每个ViewCell中指向相同的命令。但是请使用Command参数传入当前的ViewCell数据。
在ViewModel中,您可以对“选定的”数据进行操作...并执行特定的操作,例如:
public List<Person> Persons { get; set; } = new List<Person>() { new Person() { Name = "Glenn Versweyveld" }, new Person() { Name = "John Do" } };
private Command<Person> _doCommand;
public Command<Person> DoCommand => _doCommand ?? (_doCommand = new Command<Person>((Person obj) => HandlePerson(obj)));
private void HandlePerson(Person obj)
{
}