ItemSource外部的Xamarin Forms Bind命令

xoefb8l8  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(109)

我有个问题我创建了这个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));
    }
}

我做错了什么?

ut6juiuv

ut6juiuv1#

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

1szpjjfi

1szpjjfi2#

您试图从Command绑定的Context不是PageContext,而是ItemSource,这就是为什么您可以简单地将Id绑定到CommandParameter
要解决这个问题,您需要定位页面的BindingContext,因为您的Command位于ViewModel根级别。您可以通过将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>
</ListView>

相关问题