2010-01-10 31 views
5

Tôi đang sử dụng MVVM và mỗi Xem bản đồ cho một ViewModel với một quy ước. IE MyApp.Views.MainWindowView MyApp.ViewModels.MainWindowViewModelDataTemplate + MVVM

Có cách nào để loại bỏ DataTemplate và thực hiện trong C# không? với một số loại vòng lặp?

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

Trả lời

6

Vì vậy, về cơ bản, bạn cần phải tạo các mẫu dữ liệu lập trình ... Đó không phải là rất đơn giản, nhưng tôi nghĩ rằng bạn có thể đạt được điều đó với lớp 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); 
} 

tôi không kiểm tra nó , vì vậy một vài điều chỉnh có thể cần thiết ... Ví dụ tôi không chắc loại khóa tài nguyên nên là gì, vì nó thường được đặt ngầm khi bạn đặt DataType trong XAML

6

Cảm ơn Thomas, bằng cách sử dụng tôi đã làm điều này.

Bạn cần phải sử dụng DataTemplateKey khi thêm các 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); 
     } 
    }