DevExpress WinForms MVVM:为BarButtonItem绑定EventToCommand的问题
我来帮你搞定这个RibbonBar工具栏项的命令绑定问题!结合你提到的主窗体ViewModel通过构造函数传递给子控件的场景,给你梳理正确的实现步骤:
第一步:在ViewModel中定义命令
首先确保你的MyViewModel里已经定义好对应的命令属性,用DevExpress的DelegateCommand就很方便:
using DevExpress.Mvvm; public class MyViewModel { public ICommand MyToolbarCommand { get; } public MyViewModel() { // 初始化命令,关联执行逻辑 MyToolbarCommand = new DelegateCommand(ExecuteMyToolbarAction); } private void ExecuteMyToolbarAction() { // 这里写你点击工具栏按钮后要执行的业务逻辑 } }
第二步:在子用户控件中绑定命令到BarButtonItem
因为你的子控件是接收主窗体传递过来的ViewModel,不要重新创建新的ViewModel实例,直接复用传入的对象即可。这里有两种简洁的写法:
写法一:使用扩展方法链式绑定
这种方式最清爽,还能避免事件名写错的问题:
using DevExpress.Mvvm.UI; public MyUserControl(MyViewModel parentViewModel) { InitializeComponent(); var mvvmContext = new MVVMContext(); mvvmContext.ContainerControl = this; // 关联传入的ViewModel mvvmContext.SetViewModel(typeof(MyViewModel), parentViewModel); // 绑定BarButtonItem的ItemClick事件到ViewModel的命令 mvvmContext.WithEvent<BarButtonItem, ItemClickEventArgs>(yourBarButtonItem, "ItemClick") .Command(() => parentViewModel.MyToolbarCommand); }
写法二:手动创建EventToCommand实例
如果需要更精细的控制,可以手动实例化EventToCommand:
using DevExpress.Mvvm.UI; public MyUserControl(MyViewModel parentViewModel) { InitializeComponent(); var mvvmContext = new MVVMContext(); mvvmContext.ContainerControl = this; mvvmContext.SetViewModel(typeof(MyViewModel), parentViewModel); var eventToCommand = new EventToCommand { EventName = "ItemClick", Command = parentViewModel.MyToolbarCommand }; // 将行为注册到BarButtonItem上 mvvmContext.RegisterEvent(eventToCommand, yourBarButtonItem); }
关键注意点
一定要注意:BarButtonItem的点击事件是ItemClick而不是普通控件的Click,这是很多开发者容易踩的坑!
如果需要给命令传递参数,只需要加上CommandParameter配置即可:
mvvmContext.WithEvent<BarButtonItem, ItemClickEventArgs>(yourBarButtonItem, "ItemClick") .Command(() => parentViewModel.MyToolbarCommand) .CommandParameter(() => "你要传递的参数");
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

