2010-01-10 24 views
5

MVVM kullanıyorum ve her bir haritayı bir sözleşmeyle bir ViewModel'e kullanıyorum. IE MyApp.Views.MainWindowView MyApp.ViewModels.MainWindowViewModelDataTemplate + MVVM

DataTemplate kaldırmak ve C# yapmanın bir yolu var mı? bir çeşit döngü ile?

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); 
} 

bunu test etmedi:

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

cevap

6

Yani temelde, sen Çok basit değil, ama FrameworkElementFactory sınıfla Bunu başarmak düşünüyorum ... programlı veri şablonları oluşturmak gerekir Bu nedenle, birkaç ayarlama gerekli olabilir ... Örneğin, kaynak anahtarın türünün ne olması gerektiğinden emin değilim, çünkü genellikle DataType'ı ayarladığınız zaman örtük olarak ayarlandığından emin değilim. XAML

6

Teşekkürler Thomas kod bunu yaptım. 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); 
     } 
    } 
:

Sen resoures ekleyerek DataTemplateKey kullanmak gerekir