我有个问题我创建了这个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));
}
}
我做错了什么?
2条答案
按热度按时间ut6juiuv1#
您的
MenuItem.BindingContext
的作用域是该单元格中的实际项,而不是整个页面的视图模型(或ListView
)。您需要告诉绑定它需要在其他地方查找,如下所示:请注意,我删除了其中的属性,只是为了明确我添加了哪些属性。你可以保留它们,这只是为了可读性。
或者,您可以使用新的Relative Bindings。然后你可以像这样实现命令绑定:
Command="{Binding Source={RelativeSource AncestorType={x:Type local:YourViewModelClass}}, Path=DeleteDevice}"
1szpjjfi2#
您试图从
Command
绑定的Context
不是Page
的Context
,而是ItemSource
,这就是为什么您可以简单地将Id
绑定到CommandParameter
。要解决这个问题,您需要定位页面的
BindingContext
,因为您的Command
位于ViewModel根级别。您可以通过将x:Name
属性添加到ListView
并通过它定位正确的Context
来实现它。修复方法如下: