Команда Xamarin Forms Bind вне ItemSource - PullRequest
0 голосов
/ 16 марта 2020

У меня проблема. Я создал этот ListView:

<ListView ItemsSource="{Binding knownDeviceList}" SelectionMode="None" RowHeight="90" ItemTapped="device_Clicked">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <ViewCell.ContextActions>
                    <MenuItem Command="{Binding DeleteDevice}"
            CommandParameter="{Binding Id}"
            Text="Delete" IsDestructive="True" />
                </ViewCell.ContextActions>

            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

ListView связан с List с объектами в нем, но мне нужно привязать команду к ICommand вне List на уровне root ViewModel. Как я могу это сделать, потому что теперь ICommand не запускается, когда я пытаюсь удалить элемент из списка!

Вот моя команда в моей ViewModel:

public ICommand DeleteDevice
{
    get
    {
        return new Command<int>((x) => RemoveDevice_Handler(x));
    }
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Context, который вы пытаетесь связать с Command, это не Page, а ItemSource, поэтому вы можете просто связать Id с CommandParameter ,

Чтобы это исправить, вам нужно настроить таргетинг на BindingContext страницы, поскольку ваш Command живет на уровне ViewModel root. Вы можете достичь этого, добавив свойство x:Name к своему ListView и нацеливаясь на него справа Context.

Вот исправление:

<ListView x:Name="listView" ItemsSource="{Binding knownDeviceList}" SelectionMode="None" RowHeight="90" ItemTapped="device_Clicked">
<ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
            <ViewCell>
                <ViewCell.ContextActions> 
                    <MenuItem Command = "{Binding BindingContext.DeleteDevice, Source={x:Reference listView}}"
                        CommandParameter="{Binding Id}"
                        Text="Delete" IsDestructive="True"  />
                </ViewCell.ContextActions>
            </ViewCell>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>

Надеюсь, это поможет и счастливого кодирования!

0 голосов
/ 17 марта 2020

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

<ListView x:Name="MyListView">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <ViewCell.ContextActions>
                    <MenuItem Command="{Binding Path=BindingContext.DeleteDevice, Source={x:Reference MyListView}}}"/>
                </ViewCell.ContextActions>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Обратите внимание, что я удалил имеющиеся у вас атрибуты, чтобы уточнить, какие из них я добавил. Вы можете сохранить их, это только для удобства чтения.

Или вы можете использовать новые Относительные привязки . Затем вы реализуете привязку команды следующим образом:

Command="{Binding Source={RelativeSource AncestorType={x:Type local:YourViewModelClass}}, Path=DeleteDevice}"

...