2010-07-06 35 views
1

我們連線了我們的意見,視圖模型「外部」,這意味着我們有以下類型的代碼的地方:WPF新的View VS FindResource

var viewModel = new MyViewModel(); 
var view = Application.Current.FindResource("MyView") as UserControl; 
view.DataContext = viewModel; 

也就是說各種各樣的意譯。我們這樣做是爲了讓包含所有視圖的dll可以在運行時切換出來。只要dll定義了一個名爲「MyView」的資源,該資源指向usercontrol MyView就很好。

我關心的只是確保FindResource不吃虧或者是一種有意義的方式遜色於只是做以下幾點:

var view = new MyView(); 

這可能與國際奧委會進行更換。 (我們不允許用戶切換使用哪個視圖DLL,它是在應用程序啓動時確定的。)

FindResource的一件事我發現,您可能必須使用x:Shared="False"否則WPF會將您回到現有的實例,你必須確保它已經「初始化」回到它的原始狀態。

有什麼想法?

回答

2

將UIElement實例聲明爲Resources幾乎總是一個壞主意。你已經看到了這樣做的一個主要問題(和解決方法)。導致內存泄漏也很容易,因爲應用程序級別資源中的項目在啓動時被實例化並保持在那裏,直到應用程序關閉(除非您執行更多手動工作來強制清除)。

使用模板是一個更好的解決方案,它應該很容易從你已經做的事情轉換而來。該模板將根據需要實例化其子元素的新實例,並將其注入到本地,就好像它們是內聯聲明的一樣。只需在DataTemplate元素中包裝現有的UserControl聲明並移動x:Key聲明即可。然後,當你到達上面的代碼時(也可以在XAML中完成,或者可以隱式地用DataType模板完成):

var viewModel = new MyViewModel(); 
var view = Application.Current.FindResource("MyView") as DataTemplate; 
var control = new ContentControl { Content = viewModel, ContentTemplate = view };