2014-10-02 39 views
1

我正在使用兩個共享相同代碼庫並執行基本相同功能的WPF應用程序。 ApplicationA針對強大的用戶,幷包含我們支持的所有功能的所有功能。 ApplicationB更像是一個最終用戶工具 - 它看起來基本相同,但爲了儘可能簡化事情,一些更高級的功能對用戶是隱藏的。在類似的WPF應用程序之間共享視圖

在這兩個工具中有幾乎相同的視圖,唯一的區別是我們在ApplicationB中隱藏了一些控件。視圖非常相似,因此爲每個工具維護一個單獨的副本是沒有意義的。我們的視圖模型知道它們正在運行哪個應用程序,所以我們目前通過將視圖元素的可見性綁定到視圖模型的屬性來解決這個問題。

查看:

<SomeControl Visibility="{Binding Path=WhichApp}"> ... 

視圖模型:

public Visibility WhichApp 
{ 
    get 
    { 
     if (GetApp() == Apps.ApplicationB) return Visibility.Collapsed; 
     else return Visibility.Visible; 
    } 
} 

我不喜歡的的ViewModels負責處理的知名度,這是幾乎從定義視圖的屬性。這種方法也限制了我們的視圖模型在這兩種工具之外的可重用性。

我對任何替代解決方案感興趣,這些解決方案將幫助我在兩個項目之間共享視圖,同時保持視圖和視圖模型之間的關注點分離。

+0

聽起來像你應該鞏固這兩個,只是跟蹤誰是權力用戶和誰是最終用戶。 – paqogomez 2014-10-02 16:20:30

回答

1

我同意,應用程序全局的東西不應包含在每個ViewModel(DRY)中。這種事情屬於App.xaml中的靜態資源(順便說一句,這不是一種完成任何類型的全局設置的好方法,比如主題/皮膚,當前用戶的權限/角色等)。

只需在App.xaml的Visibility類型的Application.Resources中創建一個靜態資源,然後使用您現有的代碼將其綁定到App.xaml中的代碼隱藏。

現在,您有一次性計算和檢索,衆所周知的地方可以隨處訪問應用程序模式,您的視圖模型不必重新發明輪子。

1

我認爲你是在正確的軌道上。如何將該物業更改爲PowerUserMode。我認爲視圖模型有責任告訴視圖是否應該爲高級用戶呈現自己。視圖仍然可以使用BooleanToVisibilityConverter將控件上的Visibility屬性綁定到PowerUserMode屬性。

public bool PowerUserMode 
{ 
    get 
    { 
     return GetApp() != Apps.ApplicationB; 
    } 
} 

如果你不喜歡的耦合GetApp()Apps類型,你可以只擁有財產由布爾備份,讓一些其他類設置視圖模型酌情PowerUserMode

+0

如果我要走這條路線,我還會將該屬性推到繼承鏈上......創建一個BaseViewModel或具有該屬性的某種類型(以及您可能需要跨越多個控件/窗口的其他任何其他類型)。 – 2014-10-02 17:29:31

+0

這是我最初的計劃(在我們的基礎視圖模型中使用bool或enum屬性並使用轉換器)。 – zmb 2014-10-02 17:32:28

相關問題