C# DevExpress MVVM-共享视图模型&;事件命令

C# DevExpress MVVM-共享视图模型&;事件命令,c#,winforms,mvvm,devexpress,C#,Winforms,Mvvm,Devexpress,我正在使用DevExpress将MVVM添加到我的WinForms应用程序中。我有一个表单,其中包含一个ViewModel,它通过构造函数参数提供给它的所有用户控件 数据绑定工作正常,但我想通过向usercontrols工具栏项(BarButtonim)添加EventToCommand行为来为ribbonbar添加功能 我的绑定如下所示: MVVMContext context = new MVVMContext(); context.ViewModelType = typeof(MyViewM

我正在使用DevExpress将MVVM添加到我的WinForms应用程序中。我有一个表单,其中包含一个ViewModel,它通过构造函数参数提供给它的所有用户控件

数据绑定工作正常,但我想通过向usercontrols工具栏项(BarButtonim)添加EventToCommand行为来为ribbonbar添加功能

我的绑定如下所示:

MVVMContext context = new MVVMContext();
context.ViewModelType = typeof(MyViewModel);
context.WithEvent<MyViewModel, EventArgs>(cmdA, "ItemClick")
            .EventToCommand(x => x.SomeMethod());

context.WithEvent<MyViewModel, EventArgs>(cmdB, "ItemClick")
            .EventToCommand(x => x.SomeOtherMethod());

context.SetViewModel(typeof(MyViewModel), viewModel);
MVVMContext context=new MVVMContext();
context.ViewModelType=typeof(MyViewModel);
context.WithEvent(cmdA,“ItemClick”)
.EventToCommand(x=>x.SomeMethod());
context.WithEvent(cmdB,“ItemClick”)
.EventToCommand(x=>x.SomeOtherMethod());
SetViewModel(typeof(MyViewModel),viewModel);
viewModel是MyViewModel的一个实例,它包含数据并在用户控件构造函数中从表单接收


但是,在运行应用程序时,两个按钮都可以工作,但似乎绑定到MyViewModel的一个单独实例。如何使用我已有的实例?谢谢

由于您已从外部绑定上下文传递了ViewModel实例,因此应按如下方式设置MVVMContext:

// View(UserControl) side:
MVVMContext context = new MVVMContext();
// make sure that the MVVMContext will be destroyed when the UserControl destroyed
context.ContainerControl =  this; // your View(UserControl)
context.SetViewModel(typeof(MyViewModel), viewModel);
这样可以防止自动创建MyViewModel实例(在指定context.ViewModelType时使用自动创建)

然后可以像往常一样使用MVVMContext API

在您的情况下,您可以使用
bind命令
而不是
EventToCommand
,因为它是专门为处理按钮对象(如BarButtonItems)而设计的。
而且,我强烈建议您使用,它提供了非常干净和可维护的代码:

var fluent = context.OfType<MyViewModel>();
fluent.BindCommand(cmdA, x => x.SomeMethod());
fluent.BindCommand(cmdB, x => x.SomeOtherMethod());
var fluent=context.OfType();
fluent.BindCommand(cmdA,x=>x.SomeMethod());
fluent.BindCommand(cmdB,x=>x.SomeOtherMethod());