2012-02-16 135 views
0

我想封裝視圖/ viewmodel到另一個視圖/ viewmodel。目的是要有一個彈出窗口,幻燈片面板或任何你能想到的常見行爲,並在其中插入一個自定義視圖/視圖模型。繼承或封裝View/Viewmodel

我要使用通用的做這件事,但我那種堅持

父視圖模型將看起來像

public class SidePanelViewModel<T> 
{ 
    public SidePanelViewModel(T enclosedViewModel) 
    { 
     EnclosedViewModel = enclosedViewModel; 
    } 

    public T EnclosedViewModel { get; private set; } 
} 

父視圖會像

... whatever design and behavior ... 
<ContentPresenter Content="{Binding EnclosedViewModel}"/> 
... whatever design and behavior ... 

在我的映射文件,我想說,但這裏是問題:

<DataTemplate DataType="{x:Type WPFTests:SidePanelViewModel}"> 
    <WPFTests:SidePanelView /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type WPFTests:EnclosedViewModel}"> 
    <WPFTests:EnclosedView /> 
</DataTemplate> 

這不起作用,因爲viewmodel SidePanelViewModel的構造函數需要創建一個類型。

我想我想要做的是有一個視圖/視圖模型從另一種觀點/視圖模型

希望有人能對

+1

爲什麼你需要使用''?難道你不能只使用常規的'對象'或某種共享的基礎,如'IViewModel'或'ViewModelBase'嗎? – Rachel 2012-02-16 13:58:14

+0

@Rachel我不能相信我想念!我想太多花哨的技術讓我變得有點愚蠢......如果你願意的話,回答它我會驗證它是一個很好的答案。 – Guillaume 2012-02-16 15:06:44

+0

作爲回答發表:) – Rachel 2012-02-16 15:09:34

回答

2

爲什麼你需要使用<T>

難道你不能只使用常規的object或某種共享的基地,如IViewModelViewModelBase

0

在WPF泛型類的工作可以說是相當痛苦的,有時幫繼承..

我建議你創建一個基類(抽象)類,它爲你的(當然是虛擬的)方法實現默認行爲。

+0

我知道這一點,這就是我在開始時的想法,但我需要繼承該視圖以及我不知道該怎麼做 – Guillaume 2012-02-16 11:40:07

+0

但是ViewModel/View的職責是不同的。實際上ViewModel只是更新綁定。它不調用任何視圖方法。 如果您希望您的觀點具有共同的行爲,請針對您的觀點實施不同的課程 – 2012-02-16 11:44:07

+0

對不起,我對我的看法不夠清楚。我希望看到父視圖,而不僅僅是視圖模型的行爲。子視圖/ viemodel將坐在父視圖/視圖模型中並由其修飾。在父視圖中,我將有一些邊框圖像按鈕...並且我不想在子視圖中每次重寫它們 – Guillaume 2012-02-16 11:53:51