从viewmodel执行usercontrol命令

时间:2010-08-30 17:26:01

标签: wpf binding

我有一个带有命令的usercontrol,我想要做的是从包含视图的ViewModel执行此命令。

这在后面的代码中很容易实现,因为我可以去“UserControl.MyCommand.Execute”,但当然我希望能够在ViewModel中完成此操作。

理论上,我想要做的是将UserControl的命令绑定到ViewModel上的命令,我可以执行该命令,然后由UserControl处理。像这样:

...
<local:MyControl
         MyCommand="{Binding ViewModelsCommand}" />
...

当然,这会对我想做的事情产生相反的影响,因为现在ViewModelsCommand已绑定到MyCommand。那么如何反转呢?

基本上我希望能够绑定这样的东西:

ViewModelsCommand =“{Binding MyControl.MyCommand}”

任何想法或灵感都会受到欢迎,我看不到能让我这样做的具有约束力的模式。而且我不确定如何访问DataContext的绑定属性(通常你只需绑定并使用twoway处理它,但当然这在这种情况下不起作用。)

提前致谢。

3 个答案:

答案 0 :(得分:1)

您正在视图的构造函数中实例化视图模型。

为什么不在构造时明确设置值?

 public SomeView()
 {
      var viewModel = new SomeViewModel();
      viewModel.ViewModelCommand = MyCommand; // or = myControl.MyCommand

      DataContext = viewModel;
 }

可以使用与OneWayToSourceTwoWayExplicit的绑定,但您仍需在代码中至少一次显式更新源代码(总是如果你使用Explicit)。

myControl.GetBindingExpression(MyControl.MyCommandProperty).UpdateSource();

答案 1 :(得分:0)

请注意,以下答案不正确。似乎OneWayToSource仅在target-property更改后才更新。但是,我不删除此答案以通知其他不了解此行为的人(像我一样)。

旧答案(见上文)

IMO你的例子应该有用(如果MyControl.MyCommand是一个返回ICommand的公共属性)。你试过BindingMode OneWayToSource吗?

<local:MyControl 
         MyCommand="{Binding ViewModelsCommand,Mode=OneWayToSource}" /> 

答案 2 :(得分:0)

我使用PRISM的EventAggregator或MVVMLight的Messenger来允许两个ViewModel进行通话,但是如果你有一个视图(UserControl)与ViewModel交谈,你的情况会略有不同。