Добавление различных команд к элементам в динамически заполненном ListView - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть 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 голосов
/ 15 ноября 2018

Лучший способ решить эту проблему - использовать CommandParameter и решить, что делать с вашим ViewModel на основе контекста данных ViewCell.

Если вы используете Binding, вы можете привязать весь контекст текущих данных, выбрав a. (точка), таким образом данные из текущего 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. Но передайте текущие данные 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)
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...