WPF / XAML - 将控制命令绑定到父窗口的viewmodel?

时间:2012-07-31 20:30:23

标签: wpf xaml

我有一个应用程序,我有一个程序集。

在应用程序中,我有一个窗口,在程序集中我有一个用户控件。

窗口中有一个用户控件实例。

用户控件和窗口都由单独的视图模型支持。

在用户控件中,有一个按钮。应根据用户控件的viewmodel的状态启用/禁用该按钮。单击该按钮时,需要根据用户控件的viewmodel中的信息完成处理,但需要通过窗口的viewmodel完成。 (在用户控件范围之外,有些方面需要做的事情应该完成。)

这就是扭曲 - 这个用户控件不会在这个窗口中独占使用,它可能会在另一个窗口中使用,或者在第三个窗口中使用的控件中使用。不允许用户控件知道哪种窗口或控件包含它,或者在单击其按钮时处理该过程。

那么,该怎么办?

在程序集中定义一个命令,并将用户控件的按钮绑定到它,将用户控件的viewmodel作为命令参数传递?那么,如何将命令绑定到窗口的viewmodel?

或者我应该在用户控件的viewmodel中定义命令,然后引发一个事件告诉父窗口需要采取适当的操作吗?

我不清楚哪个更干净。

4 个答案:

答案 0 :(得分:2)

如果你总是知道父母的财产会以同样的名义公开,你可以做很多次这样的事情:

Command={Binding Parent.DataContext.SomeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}

这将获取usercontrol,然后转到父级并获取该datacontext并将其绑定到该命令。当用户控件被许多暴露相同命令的窗口/控件包含时,这种方法很有效(你可以在这里实现一个接口)。

然后你可以将用户控件的viewmodel传递给命令(再次实现一些接口),如下所示:

CommandParaemter={Binding }

答案 1 :(得分:0)

您可以使用Messenger结构在ViewModel之间进行通信。

您可以使用的

MVVMLight contains one或者您可以自己编写。

在此之前,请确保您确实正确地分离了职责,否则您最终会得到意大利面条消息代码。

答案 2 :(得分:0)

视图模型应该存在层次结构,就像控件一样。主窗口具有子用户控件。主视图模型应该能够与用户控制视图模型连接(并在需要时分配)。我将如何做到这一点:

public class MainVM:NotificationObject
{
  // Make this a Notify Property
  public UserVM userVM { get{return _userVM;}; set {_userVM = value; RaisePropertyChanged("userVM");}

  public MainVM
{
  userVM = new UserVM();
  userVM.ExecuteCmd = new DelegateCommand (yourAction);

}

}

public class UserVM:NotificationObject
{

public DelegateCommand ExecuteCmd {get{return _executeCmd;} set{_executeCmd = value; RaisePropertyChanged("ExecuteCmd");
}

}

XAML:

<local:urUserCtrl DataContext={Binding userVM}/>

这当然是伪造的

答案 3 :(得分:0)

听起来像战略模式的情况。 http://en.wikipedia.org/wiki/Strategy_pattern

为策略对象定义一个接口,该接口可以分配给UserControl的viewmodel(或用于初始化它)。该接口定义了使策略对象能够从UserControl视图模型中检索处理所需数据所需的任何属性/方法/事件,以及将处理结果返回给UserControl视图模型的方法。

然后创建该策略对象的具体实现,该实现与Window的viewmodel协作以执行它需要的任何任务。在这种情况下,Window的viewmodel甚至可能实现策略接口本身。

然后,可以使用策略对象的其他具体实现来初始化其他场景中的UserControl的其他实例,这些实现执行相同的所需任务,但可能以非常不同的方式。