DataTemplate + MVVM

Я использую MVVM, и каждое Представление отображается на ViewModel с конвенцией. IE MyApp. Представления. MainWindowView MyApp. ViewModels. MainWindowViewModel

Существует ли способ удалить DataTemplate и сделать это в C#? со своего рода циклом?

<DataTemplate DataType="{x:Type vm:MainWindowViewModel}">
    <vw:MainWindowView />
</DataTemplate>
5
задан Chris Kolenko 10 January 2010 в 02:11
поделиться

2 ответа

Так что в основном необходимо создавать шаблоны данных программно ... это не очень просто, но я думаю, что вы можете достичь этого с помощью класса :

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

6
ответ дан 13 December 2019 в 05:36
поделиться

Спасибо, Томас, используя твой код, я сделал это.

Вам нужно использовать 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);
        }
    }
6
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: