ItemSource外部的Xamarin Forms Bind命令

问题描述 投票:0回答:2

我有问题。我创建了这个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,但是我需要将该命令绑定到ViewModel根级别的List之外的ICommand。我该怎么做,因为现在当我尝试从列表中删除项目时,不会触发ICommand!

这是我的ViewModel中的命令:

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

我在做什么错?

c# xamarin xamarin.forms xamarin.android xamarin.ios
2个回答
0
投票

您的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>

请注意,我删除了其中的属性,只是为了弄清楚我添加了哪些属性。您可以保留它们,这只是出于可读性。

或者,您可以使用新的Relative Bindings。然后,您将实现命令绑定,如下所示:

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


0
投票

您要从Context绑定的Command不是Page的那个,而是ItemSource,这就是为什么您可以简单地将Id绑定到CommandParameter

[要解决此问题,由于您的BindingContext位于ViewModel根级别,因此您需要定位页面的Command。您可以通过在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>

希望对您有帮助,并祝您编程愉快!

© www.soinside.com 2019 - 2024. All rights reserved.