向动态填充的ListView中的元素添加不同的命令

时间:2018-11-15 08:15:12

标签: c# xaml xamarin.forms

我有一个带有动态添加项的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>

1 个答案:

答案 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)
{

}