2012-07-31 134 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的其他實例,以執行相同的所需任務,但可能採用非常不同的方式。

相關問題