我有一个带有命令的usercontrol,我想要做的是从包含视图的ViewModel执行此命令。
这在后面的代码中很容易实现,因为我可以去“UserControl.MyCommand.Execute”,但当然我希望能够在ViewModel中完成此操作。
理论上,我想要做的是将UserControl的命令绑定到ViewModel上的命令,我可以执行该命令,然后由UserControl处理。像这样:
...
<local:MyControl
MyCommand="{Binding ViewModelsCommand}" />
...
当然,这会对我想做的事情产生相反的影响,因为现在ViewModelsCommand已绑定到MyCommand。那么如何反转呢?
基本上我希望能够绑定这样的东西:
ViewModelsCommand =“{Binding MyControl.MyCommand}”
任何想法或灵感都会受到欢迎,我看不到能让我这样做的具有约束力的模式。而且我不确定如何访问DataContext的绑定属性(通常你只需绑定并使用twoway处理它,但当然这在这种情况下不起作用。)
提前致谢。
答案 0 :(得分:1)
您正在视图的构造函数中实例化视图模型。
为什么不在构造时明确设置值?
public SomeView()
{
var viewModel = new SomeViewModel();
viewModel.ViewModelCommand = MyCommand; // or = myControl.MyCommand
DataContext = viewModel;
}
可以使用与OneWayToSource
,TwoWay
或Explicit
的绑定,但您仍需在代码中至少一次显式更新源代码(总是如果你使用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交谈,你的情况会略有不同。