代码之家  ›  专栏  ›  技术社区  ›  Chris Nicol

从ViewModel执行UserControl命令

  •  0
  • Chris Nicol  · 技术社区  · 14 年前

    我有一个带有命令的用户控件,我想从包含视图的ViewModel执行这个命令。

    这在后面的代码中很容易完成,因为我可以直接转到“usercontrol.mycommand.execute”,但当然我希望能够在ViewModel中实现这一点。

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

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

    当然,这会对我想做的事情产生相反的影响,就像现在VIEWModelsCommand绑定到MyCommand一样。那么如何反转这个呢?

    基本上,我希望能够绑定这样的内容:

    viewModelsCommand=“绑定mycontrol.mycommand”

    任何想法或灵感都会受到欢迎,我看不到一种能让我这样做的约束模式。我不知道如何访问数据上下文的属性进行绑定(通常您只需要绑定并让twoway处理这个问题,但在这个场景中当然不起作用)。

    事先谢谢。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Jay    14 年前

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

    为什么不在构造时显式设置该值?

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

    可以使用绑定 OneWayToSource , TwoWay Explicit ,但在代码中至少必须显式更新一次源代码(如果使用 明确的 )

    myControl.GetBindingExpression(MyControl.MyCommandProperty).UpdateSource();
    
        2
  •  0
  •   JoshVarga    14 年前

    我使用Prism的EventAggregator或MVVMlight的messenger来允许两个视图模型进行对话,但您的情况与视图(UserControl)与视图模型进行对话时的情况略有不同。

        3
  •  0
  •   HCL    14 年前

    请注意,以下答案不正确。OneWayToSource似乎只在目标属性更改后更新。但是,我不会删除这个答案来通知其他不了解这种行为的人(比如我)。

    旧答案 (见上文)

    IMO您的示例应该有效(如果mycontrol.mycommand是返回ICommand的公共属性)。你试过装订模式了吗 OneWayToSource ?

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