2012-11-02 17 views
1

幾天前我問了this question,但tbh的答案讓我更加困惑。所以我會問一個更簡單的問題:在Caliburn.micro切換Viewmodels/Views的簡單方法

(我正在使用Caliburn.Micro,這是一個WPF應用程序)。假設你有一個MainView/MainViewModel,它有AView/AViewModel和BView/BViewModel。您的MainView是一個網格,也是您希望用AView或BView填充的單元之一,具體取決於用戶的選擇。如果我只是想表現AView,我會做到以下幾點:

在的MainView:

<StackPanel Name="SP_Controls" VerticalAlignment="Bottom" Grid.Row="1" Grid.Column="0"> 
    <ContentControl Name="ViewModelToShow" Margin="10" /> 
</StackPanel> 

,並在MainViewModel:

public AViewModel ViewModelToShow{get; set;} 

我天真的想法,現在會做一些事情像這樣:

private AViewModel _AVM; 
private BViewModel _BVM; 

public ... ViewModelToShow{ get; set;} 

然後在代碼,例如,設置視圖模型以顯示:

ViewModelToShow = _BVM; 

我唯一的問題是「...」,因爲每個ViewModel是不同的類。有沒有辦法與泛型做到這一點,或者我應該爲我的ViewModel定義一個基類,並將它們投射到這些基類中?但如果我這樣做,他們仍然會正確顯示。謝謝。

+0

我不確定我完全理解你想要做什麼。你的VM可以繼承PropertyChangedBase甚至屏幕。我在這裏有一些WPF/CM示例:https://bitbucket.org/dbeattie –

回答

6

您查看模型應該繼承自PropertyChangedBaseScreenScreen繼承自PropertyChangedBase,並且還實施IScreenScreen增加了生命週期(即OnActivate等)。

然後,您可以使用您的方法,即擁有一個名爲例如CurrentViewModel,它是IScreen的類型。您可以在需要時將其設置爲適當的視圖模型。請注意,如果您希望UI更新正確,則此引用更改時此CurrentViewModel屬性應在設置器中調用NotifyOfPropertyChange

或者,您可以將父視圖模型視爲兩個子視圖模型的導體,並使用內置的Caliburn.Micro Conductor類型。例如,從Conductor<IScreen>.Collection.OneActive派生。

然後,您可以將2個子視圖模型添加到父級的Items集合,並調用ActivateItem方法來設置當前視圖模型。然後將您的視圖ContentControl更新爲x:NameActiveItem

請參閱here瞭解更多信息。

+0

感謝您的詳細解答。現在我會嘗試簡單的方法,在我的下一個項目中,我會嘗試'指揮'方法。 – EluciusFTW

+0

你也可以簡單地使用「公共對象CurrentViewModel」。 – bj0

1

以上所有答案都是正確的。就視圖位置如何工作而言,屬性類型無關緊要。只有實例的運行時類型很重要。所以,你甚至可以將屬性定義爲類型對象,它仍然可以工作。只要確保你的財產提出更改通知。在Conductor的情況下,ActiveItem爲您處理。

+0

Thx,這就是我想知道的...在閱讀你的評論之前,我用一個基類等進行了測試,最終一直到Object,並且它仍然工作。非常好。 – EluciusFTW

1

我通常從ViewModelBase類繼承。它是一個包含所有屬性改變的位和bob的類。但由於視圖上的DataContext屬性只是一個對象,因此類型無關緊要。

相關問題