2012-07-25 39 views
0

我在PRISM體系結構中有一個WPF應用程序。子視圖不會自動實例化其「視圖模型」

我有一個用戶控制(視圖),其中有2個用戶控件。

Here is the idea : Here is an idea : http://s18.postimage.org/5i0vik8vr/SO_Question_6.png

之所以在「搜索用戶制」是在其自己的用戶控制,是因爲我打算在我的應用程序重複使用它。

主要用戶控件(黑色)被稱爲「的MainView」,並具有在其2個用戶控制: - 用戶控制具有幾個TextBox控件我可以過濾通過,以及「搜索」按鈕 - 顯示結果的網格的用戶控件

這些用戶控件(和父級,「主視圖」)中的每一個都是「視圖」並具有「視圖模型」。

除了「孩子」用戶控件不會自動創建自己的「視圖模型」這一事實之外,一切都很好顯示。

在視圖模型中的類我有「導出」屬性, 並在查看的隱藏代碼,我有這樣的片段:

[Import] 
FilterFieldsViewModel ViewModel 
{   
    set 
    { 
     this.DataContext = value; 
    } 
} 

設置「視圖模型」 確實發生的'主視圖',但不是爲子視圖...

我有一個命令綁定到'搜索用戶控件'的搜索按鈕, ,當應用程序加載 - 我得到輸出窗口出錯,說:

BindingExpression path error: 'SearchCommand' property not found on 'object' ''MainWindowViewModel' (HashCode=22047425)'. BindingExpression:Path=SearchCommand; DataItem='MainWindowViewModel' (HashCode=22047425); target element is 'Button' (Name='Search'); target property is 'Command' (type 'ICommand')

出於某種原因,從「孩子」的用戶控件試圖命令綁定到在主窗口中的視圖模型視圖模型,因爲某些原因 - 孩子的用戶控件的視圖模式不會被實例化。

這是爲什麼?

回答

2

您的依賴注入容器(MEF)未在子視圖上註冊導入,因爲它們是由MainView而不是由MEF創建的。你可能想要做的是建立在你的MainViewModel屬性:在XAML

[Import] 
public FilterFieldsViewModel FilterFieldsViewModel {get; set; } 

然後:

<UserControl ....> 
    ... 
    <SearchUserControl DataContext="{Binding FilterFieldsViewModel}" ... /> 
    ... 
</UserControl> 

這使MEF爲您創造的FilterFieldsViewModel一個實例,並將其發送到該SearchUserControl

這是當然的基本概念,也許你會想要創建一個'SearchViewModelBase'或其他有FilterFieldsViewModel的東西。

+0

偉大的解決方案,只有一個問題 - 這不是主視圖與子視圖? – 2012-07-26 08:24:42

+0

我在某處讀到,可能的解決方案可能是爲'搜索控件'定義一個區域併爲'網格控件'定義一個區域,然後使用MEF自動將控件加載到這些區域。這種方法的問題在於,在設計過程中 - 我無法看到最終的「主」窗口與其中的控件的外觀是什麼樣的......你明白嗎? – 2012-07-26 08:25:42

+0

@JohnMiner你的確是正確的,從架構的角度來看,定義子區域是一個更好的解決方案,但它更多的工作,所以我猜這是更多的'財務'決定。 – Bas 2012-07-26 09:04:02