2010-12-10 65 views
3

我有一個Windows WPF應用程序,我在其中使用Caliburn.Micro。主窗口視圖/視圖模型由Caliburn.Micro處理。其中一個按鈕彈出一個新的對話窗口,它使用不同的視圖模型。包含兩個Caliburn.Micro視圖的對話框視圖?

在這個對話框中,我有一個容器(列表框和一些過濾器控件),我想將它們製作爲一個可重用的控件,以便將其包含在其他對話框中。爲此,我從對話框的視圖和視圖模型中提取了相關的代碼,並創建了一個新的視圖和視圖模型。這一切看起來不錯。

問題是,現在回到對話框中,我有一個大的空白空間,我需要可重用的控制去的dockpanel。

從對話框viewmodel OnInitalize()我可以創建可重用的控件viewmodel,但我不知道如何將它的視圖放到對話視圖的dockpanel中。我們使用WindowManager()。ShowDialog()來顯示對話框的視圖模型,Caliburn.Micro負責設置視圖。有沒有一種方法可以在對話框的XAML中指定我想要嵌入可重用控件的視圖並讓Caliburn創建適當的視圖/視圖模型?

或者我正在錯誤的方式呢?

回答

8

如果您的對話框視圖模型是另一個視圖模型類型的屬性,並且將ContentControl添加到與此屬性命名相同的對話框視圖中,則Caliburn.Micro會自動注入相應的視圖將您的屬性視圖模型類型轉換爲ContentControl佔位符,並將該視圖模型類型自動綁定到視圖。你是這個意思嗎?喜歡的東西:

// Dialog View Model 
private MyReusableControlViewModel myReuseableControl; 
public MyReusableControlViewModel MyReuseableControl 
{ 
    get { return this.myReuseableControl; } 
    set { this.myReuseableControl = value; NotifyOfPropertyChanged(...); } 
} 

// Dialog View Model Constructor 
public DialogViewModel() 
{ 
    this.MyReuseableControl = new MyReusableControlViewModel(); 
} 

// Dialog View 
<DockPanel> 
    ... 
    <ContentControl x:Name="MyReusableControl" /> 
</DockPanel> 

當然,理想情況下,你將要注入的對話視圖模型(在這種情況下MyReusableControlViewModel)和工作對抽象任何依賴該對話框視圖模型裏面,而不是具體類型。

+0

這聽起來像我正在尋找的東西,我會試試看。 – DaveK 2010-12-13 15:30:15

+0

完美的作品,謝謝! – DaveK 2010-12-13 21:41:59

+0

花了幾個小時試圖弄清楚,然後我找到了答案。非常感謝,解決方案比我想象的要簡單得多。 – 2012-04-27 01:29:04