我有问题。我创建了这个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));
}
}
我在做什么错?
您的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}"
您要从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>
希望对您有帮助,并祝您编程愉快!