2017-01-30 59 views
0

我一直在構建一個WPF應用程序。到目前爲止,大多數ViewModel嚴格禁止他們自己的代碼。 我最近決定創建一個基類「ApplicationViewModel」將通用代碼遷移到其中。對於大多數情況下,這工作正常,但我遇到了我遇到困難的問題。如何確保只有一個View Model Base類的實例?

看來我的繼承視圖模型正在產生他們自己的這個基本視圖模型的實例。結果是;如果ClassA中的某個方法更改基類中的某個變量,那麼ClassB仍會將相同的變量註冊爲null,或者以前的任何值都是如此。

起初我以爲微軟的統一容器將解決這一問題註冊實例,

public App() 
{ 

    Container.RegisterType<ApplicationViewModel>(new ContainerControlledLifetimeManager()); 
} 

但什麼也沒有改變。

我在研究後發現的明顯答案是將類變爲靜態的,但在我走向該路線之前,我更希望有另一種解決方案。我的程序功能太多可能需要重新加工。

我不確定是否單例實例屬性甚至可以使用基類聲明。

所以我想我的問題是:我將如何確保在所有ViewModel中使用此視圖模型基類的相同實例?

+2

如果所有的ViewModels從這個基礎視圖模型繼承的話,單一實例共享是不可能的,它甚至沒有意義 –

+0

這是另一個角度;單個基類實例的用例是什麼? –

+0

發佈類結構的大綱。一個小小的C#比描述更清晰。你所描述的並不是那麼明顯。 –

回答

2

我該如何確保在所有ViewModel中使用此視圖模型基類的相同實例?

不可能。基類是繼承它的類定義的一部分,即基類和派生類是同一個實例的一部分。當您創建一個dervived類的實例時,只會創建該類型的單個實例。基本類型是這種類型的一部分。

如果你只想要一個基類繼承的單個實例不是解決方案。

相反,你可以得到使用從每個子視圖模型的Container到共享視圖模型對象的引用:

public class ChildViewModel //doesn't inhert from the base view model 
{ 
    public ChildViewModel() 
    { 
     var sharedViewModel = Container.Resolve<ApplicationViewModel>(); 
     //call any properties or methods of the sharedViewModel... 
    } 
} 
+1

這是教育。非常感謝。你的解決方案是天才。 – Offer

0

如果您的視圖模型真的(技術上)從基類繼承,這需要每個繼承視圖模型實例的基類實例。

您可以通過創建靜態類(或單例實例)來解決您的問題,該靜態類(或單例實例)存儲這些值,對於所有現有的視圖模型,這些值應該相等。

您的基類仍然可以包含使用這些靜態變量的非靜態訪問器(get-/set方法)。實際上,您的視圖模型不需要知道值的存儲位置。

實際上,這將非常接近靜態基類中定義的某些字段/屬性。所以也許這也是一個選擇。

0

對不起,但沒有辦法讓一個派生類的實例有一個基類實例。

我可以建議下一個設計。在基類中創建一個字段:

private static Dictionary<string, object> _hash = new Dictionary<string, object>

,並創建基類保護的屬性派生類:

protected string Title { 
get { 
    string value; 
    ApplicationViewModel._hash.TryGetValue("Title", out value); 
    return value; 
    } 
    set { 
    ApplicationViewModel._hash["Title"] = value; 
    } 
} 

我希望會適合你。

相關問題