2010-08-19 163 views
2

我有一個類嚮導,它創建一個在同一個項目中定義頁面的嚮導。 PageViewModel與PageView分開。 PageViewModel是派生自PageViewModelBase抽象類的普通C#類,PageView是UserControl。爲了定義PageViewModel和瀏覽量之間的映射我寫的每一頁下面的​​代碼在我的項目:如何將DataTemplate添加到資源中?

<Window.Resources> 
    <DataTemplate DataType="{x:Type OurNewPageViewModel}"> 
     <OurNewPageView /> 
    </DataTemplate> 
    </Window.Resources> 

現在我要添加網頁時,用戶的代碼調用我的嚮導的構造函數嚮導。它意味着將頁面視圖和視圖模型移動到用戶端。例如,爲了創建一個帶有一個頁面用戶的嚮導,將寫入以下代碼: 嚮導usersWizard = new Wizard(new usersViewModel(),new userView()); 問題是我不知道如何在我的構造函數中提供viewModel和View之間的映射。據我所知,我可以用兩種不同的方法來解決這個問題。首先,要使用FrameworkElementFactory但以下代碼不起作用:

 //let we have WelcomePageView wpview and WelcomePageViewModel wpviewmodel 

     FrameworkElementFactory fef = new FrameworkElementFactory(wpview.GetType()); 
     DataTemplate dt = new DataTemplate(); 
     dt.DataType = wpview.GetType(); 

     dt.VisualTree = fef; 

     base.Resources.Add(wpviewmodel.GetType(), dt); 

二,使用XamlReader。我可以使用它創建數據模板,但我不知道如何將其附加到資源。

回答

3

在您的代碼隱藏創建DataTemplate中,有一對夫婦的錯誤:

  1. 「dt.DataType = wpfView.GetType()」 應爲「dt.DataType = wpfviewmodel .GetType ()「
  2. 將模板添加到ResourceDictionary時應使用DataTemplateKey。

所以,你的代碼應該是這樣的:

DataTemplate dt = new DataTemplate(); 
dt.DataType = typeof(PageViewModel); 
FrameworkElementFactory fef = new FrameworkElementFactory(typeof(PageView)); 
dt.VisualTree = fef; 
DataTemplateKey dtKey = new DataTemplateKey(typeof(PageViewModel)); 
this.Resources.Add(dtKey, dt); 
+0

非常好!這是一個瞭解ioc的超級開始,用自己的引導程序,等等......謝謝:-) – peter70 2016-02-16 19:28:12