Как связать CommandParameter для просмотра метки ячейки в ListView (формы Xamarin) - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь создать сгруппированный ListView для блюд и продуктов с кнопкой Add Food для каждого приема пищи. Но когда выполняется команда «Добавить пищу», я не знаю, к какой еде я должен добавить еду. Поэтому я подумал, что было бы хорошо передать название еды в качестве параметра, но я не знаю как.

Это ViewModel

public class ViewModel : BaseViewModel
{      
    public FoodViewModel()
    {
        this.AddFood = new Command<string>(this.OnAddFood);
        this.MealGroups = new ObservableCollection<MealGroup>();
    }
    public ObservableCollection<MealGroup> MealGroups { get; set; }
    public ICommand AddFood { get; private set; }
    private void OnAddFood(string param)
}

Это MealGroup

public class MealGroup : ObservableCollection<Food>
{
    public string MealName { get; set; }
    public ObservableCollection<Food> Foods => this;
}

Это ListView

<StackLayout x:Name="MealLayout" HorizontalOptions="FillAndExpand">
                <Button x:Name="AddMealButton" Text="Add Meal" Command="{Binding AddMeal}"/>

            <ListView x:Name="MealGroupsListView" ItemsSource="{Binding MealGroups}" IsGroupingEnabled="true">
                <ListView.GroupHeaderTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout x:Name="MealInfoLayout" Orientation="Horizontal">
                                <Label x:Name="MealNameLbl" Text="{Binding MealName}" />

                                <StackLayout>
                                    <StackLayout.BindingContext>
                                        <local:FoodViewModel/>
                                    </StackLayout.BindingContext>
                                    <Button x:Name="AddFoodCommand" 
                                        Text="Add Food"
                                        Command="{Binding AddFood}"
                                            CommandParameter="{Binding }"/>
                                </StackLayout>

                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.GroupHeaderTemplate>

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Label x:Name="FoodNameLbl" Text="{Binding Name}" />
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
</StackLayout>

Ответы [ 3 ]

0 голосов
/ 14 октября 2019

Во-первых, я должен добавить foodId в классе. Более эффективно найти элемент обратно с такой инструкцией:

Mg = MealGroups.First(o => o.Id == SearchedMealGroupId);

В этом случае я лично использую функцию ItemTapped представления списка без кнопки (или, может быть, просто изображение для пользовательского интерфейса).

<ListView x:Name="listElement" .... ItemTapped="listElement_ItemTapped" ..../>

и в .xmal.cs:

private void listElement_ItemTapped(object sender, ItemTappedEventArgs e)
{
     int SelectedMealGroupId = ((MealGroup)e.Item).Id; // You are sure of the type of e.Item !
     ....
     // You can call methods of the VM with :
     ((ViewModel)BindingContext).OnAddFood(SelectedMealGroupId); // Int parameter, not string
}
0 голосов
/ 14 октября 2019

Есть еще один лучший способ получить доступ ко всему объекту (не только к имени)

<Button x:Name="AddFoodCommand" 
        Text="Add Food"
        Command="{Binding AddFood}"
        CommandParameter="{Binding .}"
    />

Благодаря этому CommandParameter вернет весь элемент

0 голосов
/ 14 октября 2019

Просто передайте имя свойства как Path вашей Binding:

<Button x:Name="AddFoodCommand" 
        Text="Add Food"
        Command="{Binding AddFood}"
        CommandParameter="{Binding MealName}"/>

Ваша команда AddFood будет вызываться со свойством MealName в качестве параметра.

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