2010-01-10 55 views
5

我正在使用MVVM,並且每個View都使用約定映射到ViewModel。 IE MyApp.Views.MainWindowView MyApp.ViewModels.MainWindowViewModelDataTemplate + MVVM

有沒有辦法刪除DataTemplate並在C#中執行它?有某種循環?

<DataTemplate DataType="{x:Type vm:MainWindowViewModel}"> 
    <vw:MainWindowView /> 
</DataTemplate> 

回答

6

因此,基本上,你需要以編程方式創建數據模板......這不是很簡單,但我認爲你可以做到這一點與FrameworkElementFactory類:

public void AddDataTemplateForView(Type viewType) 
{ 
    string viewModelTypeName = viewType.FullName + "Model"; 
    Type viewModelType = Assembly.GetExecutingAssembly().GetType(viewModelTypeName); 

    DataTemplate template = new DataTemplate 
    { 
     DataType = viewModelType, 
     VisualTree = new FrameworkElementFactory(viewType) 
    }; 

    this.Resources.Add(viewModelType, template); 
} 

我沒有測試,所以一些調整可能是必要的...例如我不知道什麼樣的資源鍵應該是,因爲它通常是隱式設置當你在XAML設置數據類型

6

謝謝托馬斯,使用你的我已經完成了這個代碼。

您需要使用添加resoures當DataTemplateKey:d

private void AddAllResources() 
    { 
     Type[] viewModelTypes = Assembly.GetAssembly(typeof(MainWindowViewModel)).GetTypes() 
      .Where(t => t.Namespace == "MyApp.ViewModels" && t.Name.EndsWith("ViewModel")).ToArray(); 

     string viewName = null; 
     string viewFullName = null; 

     foreach (var vmt in viewModelTypes) 
     { 
      viewName = vmt.Name.Replace("ViewModel", "View"); 
      viewFullName = String.Format("MyApp.Views.{0}, MyApp", viewName); 

      DataTemplate template = new DataTemplate 
      { 
       DataType = vmt, 
       VisualTree = new FrameworkElementFactory(Type.GetType(viewFullName, true)) 
      }; 

      this.Resources.Add(new DataTemplateKey(vmt), template); 
     } 
    } 
相關問題