2012-07-31 173 views
0

我有一个应用程序,我有一个程序集。WPF/XAML - 绑定控制命令到父窗口的viewmodel?

在应用中,我有一个窗口,并在该组件我有一个用户控制。

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

两个用户控制和窗口是由单独的ViewModels支持。

在用户控件中,有一个按钮。该按钮应根据用户控件的视图模型的状态启用/禁用。单击按钮时,需要根据用户控件的视图模型中的信息完成处理,但需要通过窗口的视图模型完成。 (有些方面需要做,而且应该超出用户控制范围。)

而这里是扭曲的 - 这个用户控件不会在这个窗口中专门使用,它可能会在另一个中使用,或者在第三个控件中使用。用户控件不能被允许知道什么样的窗口或控件包含它,或者当它的按钮被点击时处理该过程。

那么,该怎么办?

在组件定义一个命令,并且用户控制的按钮绑定到它,传递用户控件的视图模型作为命令参数?那么,我该如何将命令绑定到窗口的viewmodel?

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

我不清楚哪个更清洁。

回答

2

如果你总是知道父母的财产将被暴露具有相同名称相同,你可以做这样的事情已经工作了我很多次:

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

这得到了用户控件,然后转到父级并获取该数据上下文并将其绑定到该命令。当用户控件被许多暴露相同命令的窗口/控件包含时(这里你可以实现一个接口),这是有效的。

然后,您可以通过用户控件的视图模型的命令(再次,实现一些接口),像这样:

CommandParaemter={Binding } 
0

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

MVVMLight contains one,你可以使用或者你也可以自己编写。

这样做确保你没有正确地分离的责任,否则你会用意大利面的消息代码结束之前。

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}/> 

这当然是伪代码

0

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

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

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

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

相关问题