Я использую MVVM, и каждое Представление отображается на ViewModel с конвенцией. IE MyApp. Представления. MainWindowView MyApp. ViewModels. MainWindowViewModel
Существует ли способ удалить DataTemplate и сделать это в C#? со своего рода циклом?
<DataTemplate DataType="{x:Type vm:MainWindowViewModel}">
<vw:MainWindowView />
</DataTemplate>
Так что в основном необходимо создавать шаблоны данных программно ... это не очень просто, но я думаю, что вы можете достичь этого с помощью класса
:
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);
}
I Не тестировал его, поэтому может потребоваться несколько корректировок ... Например, я не уверен, какой тип ключа ресурсов должен быть, поскольку он обычно устанавливается неявно, когда вы устанавливаете DataType в XAML
Спасибо, Томас, используя твой код, я сделал это.
Вам нужно использовать 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);
}
}