2010-08-03 32 views
1

我想在我的框架中編寫一個具有MVVM模式的Detail(Info)屏幕。將會有一個基本的詳細視圖模型和視圖,在這個工具欄上有一個工具欄和按鈕(保存,刪除,新按鈕等)。這個框架的用戶將不用手動添加工具欄來編寫他/她的詳細信息(信息)屏幕。他們的細節(信息)屏幕的視圖模型將從框架的細節(信息)視圖模型繼承。所以工具欄會自動添加到他/她的詳細信息(信息)屏幕上。在MVVM中實現可視化繼承的策略是什麼?

有沒有人實現這樣的情況之前,或者你可以給我在這個問題上的模式或戰略?謝謝大家。

回答

1

我沒有在我的MVVM可視化繼承 - 我設計我的計劃,以適應該平臺不明確使用不支持的技術。

我建立共同的元件無論是作爲該視圖使用一個控制或作爲從裝飾或ContentControl中衍生的,該框架自動插入(在這種情況下,視圖變成控制的子層)的類。

即使你找到了一些解決方法,可以讓你使用可視化繼承它不支持和肯定的方式來陷入困境後,當你打你的解決方法

2

我不使用可視化繼承的限制。相反,我有主窗口與按鈕工具欄和我插入用戶控件的區域。

的ViewModels爲每個用戶控制界面實現具有對工具欄上的按鈕的命令,所以可結合按鈕命令中的每個用戶控制的實現。

參見MSDN文章中例如:WPF Apps With The Model-View-ViewModel Design Pattern

1

我認爲「繼承」是不正確的術語,你可以用在這種情況下,雖然我不知道是什麼。

「繼承」指一種特定的類別和子類之間的關係。您可以構建視圖模型基類並從它們繼承,但是您無法真正有意義地在視圖中執行該操作,因爲視圖是通過構圖構建的,而不是通過實現屬性和方法構建的。

這當然有道理的構建視圖模型基類,做你的描述,雖然。我現在正在做一個我正在開發的項目。我有一個視圖模型類,通過公開CommandLinks集合來支持菜單中的鏈接。集合中的每個CommandLink對象都會顯示鏈接文本,更詳細的說明以及Command。在視圖中,我有一個DataTemplate,它在DockPanel內部設置了HyperlinkTextBlock,並且視圖模型的DataTemplate包含ItemsControl,它與我的視圖模型中的CommandLinks集合綁定。視圖模型子類填充CommandLinks集合,Bob是你的叔叔。我的應用程序不需要在基類中填充CommandLinks集合,因爲每個視圖模型類的命令都不相同,但沒有理由不能。儘管如此,我不會稱之爲「可視化繼承」。因爲如果我決定以不同的方式佈置特定的視圖模型類,我不能在我的實現中重寫DataTemplate。我必須專門爲該課程構建新的DataTemplate。這是繼承概念開始崩潰的地方。

如果我將(例如)的DataContext設置爲我的視圖模型的實例,WPF將查看資源字典以查找由對象類型鍵入的DataTemplate。如果派生類型沒有定義,它將使用基類型的模板。但是如果派生類型確實有有一個定義,WPF將使用該定義。而且你真的沒有辦法從另一個模板繼承一個模板,所以子類的模板不能像神奇般地看起來像基類的模板。

你最終實現它是這樣,而不是:

<DataTemplate DataType="{x:Type MyBaseClass}"> 

    <DataTemplate.Resources> 
     <DataTemplate DataType="{x:Type MyBaseClass}"> ... 
     <DataTemplate DataType="{x:Type MyDerivedClass1}"> ... 
     <DataTemplate DataType="{x:Type MyDerivedClass2}"> ... 
    </DataTemplate.Resources> 

    <DockPanel> 
     <ItemsControl DockPanel.Dock="Left" ItemsSource="{Binding CommandLinks}"/> 
     <ContentPresenter DataContext="{Binding}"/> 
    </DockPanel> 

</DataTemplate> 

這不是真正繼承。沒有辦法讓別人實現他們自己的派生類而不修改基類的數據模板。

你可以通過給容器模板一個鍵來解決這個問題。但是,實施該觀點的人需要知道這一點。他不能僅僅做到這一點,例如:

<ItemsControl ItemsSource="{Binding MyObjectList}"/> 

而是必須做這樣的事情:

<ItemsControl ItemsSource="{Binding MyObjectList}" ItemTemplate="{StaticResource MyBaseClassTemplate}"/> 

看起來像一個巨大的代價,對我來說這並不。但是,我通常是我項目中唯一的開發人員。