2010-01-10 9 views
5

J'utilise MVVM et chaque View correspond à un ViewModel avec une convention. IE MyApp.Views.MainWindowView MyApp.ViewModels.MainWindowViewModelDataTemplate + MVVM

est-il un moyen de supprimer le DataTemplate et le faire en C#? avec une sorte de boucle?

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

Répondre

6

Donc, fondamentalement, vous devez créer des modèles de données ... Ce programme n'est pas très simple, mais je pense que vous pouvez y arriver avec la classe 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); 
} 

Je n'ai pas testé ce Par exemple, je ne suis pas sûr de ce que devrait être le type de la clé de ressource, car il est généralement défini implicitement lorsque vous définissez le DataType en XAML

6

Merci Thomas, en utilisant votre code que j'ai fait ça.

Vous devez utiliser le DataTemplateKey lors de l'ajout des resoures: 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); 
     } 
    }