Xamarin ViewCell绑定问题:如何修改其绑定上下文调用页面命令
解决ViewCell中绑定页面ViewModel命令的问题
我完全理解你的困扰——把OnDelete命令塞进IssueModel数据模型里确实不符合MVVM的分层原则,命令属于视图逻辑层,不该污染纯数据模型。下面给你两个简单有效的方法,不用修改ViewCell的绑定上下文,就能直接绑定到页面的ViewModel命令:
方法1:使用RelativeSource绑定到页面ViewModel
因为你的页面继承自freshMvvm:FreshBaseContentPage,它的BindingContext就是对应的FreshBasePageModel,我们可以通过RelativeSource向上查找页面类型,直接引用它的BindingContext里的命令:
<ViewCell.ContextActions> <MenuItem Text="Delete" Command="{Binding BindingContext.OnDeleteCommand, RelativeSource={RelativeSource AncestorType={x:Type freshMvvm:FreshBaseContentPage}}}" CommandParameter="{Binding .}" /> </ViewCell.ContextActions>
RelativeSource={RelativeSource AncestorType={x:Type freshMvvm:FreshBaseContentPage}}:告诉绑定系统向上找到最近的FreshBaseContentPage实例BindingContext.OnDeleteCommand:访问页面实例的BindingContext(也就是你的ViewModel)里的OnDeleteCommandCommandParameter="{Binding .}":把当前的IssueModel对象作为参数传给命令,这样ViewModel里就能知道要删除哪一项
方法2:给页面命名,用x:Reference绑定
另一种更直观的方式是给页面设置一个x:Name,然后直接通过引用访问它的BindingContext:
<freshMvvm:FreshBaseContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Name="IssuePage" <!-- 其他命名空间和属性 --> > <ListView ItemsSource="{Binding Issues}"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <ViewCell.ContextActions> <MenuItem Text="Delete" Command="{Binding BindingContext.OnDeleteCommand, Source={x:Reference IssuePage}}" CommandParameter="{Binding .}" /> </ViewCell.ContextActions> <!-- ViewCell的内容布局 --> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </freshMvvm:FreshBaseContentPage>
这种方式和方法1效果一致,只是通过页面的名称直接引用,代码可读性可能更高一些。
补充:ViewModel里的命令示例
确保你的ViewModel(继承自FreshBasePageModel)里正确定义了OnDeleteCommand,比如:
public class IssuePageModel : FreshBasePageModel { public ObservableCollection<IssueModel> Issues { get; set; } public ICommand OnDeleteCommand => new Command<IssueModel>(issue => { // 执行删除逻辑,比如从集合中移除 Issues.Remove(issue); // 或者调用后端API删除数据 }); // 其他ViewModel逻辑... }
这两种方法都不需要修改ListView的BindingContext,也不用把命令放到IssueModel里,完美贴合你的需求。
内容的提问来源于stack exchange,提问作者JsonDork
相关产品推荐
相关产品推荐

