MVVM - Где я должен поместить код, который динамически генерирует и загружает XAML? - PullRequest
1 голос
/ 18 июля 2009

Я думаю, это философский вопрос, но у меня есть код, который динамически добавляет шаблонные столбцы в GridView, генерируя XAML во время выполнения из данных модели и загружая его с помощью XamlReader. Мой вопрос: в мире MVVM, где я должен поместить код, который выполняет это? В данный момент он у меня есть в коде, но я обдумываю, стоит ли мне переместить его в ViewModel.

Ответы [ 5 ]

2 голосов
/ 19 июля 2009

В кругах разработчиков WPF / Silverlight наблюдается значительное движение к переходу к архитектурному решению MVVM, однако они не идут дальше простых или общих примеров. Это не большая проблема в простых приложениях. Это становится серьезным, когда вы созерцаете

  • экран или страница, созданные динамически, возможно, в ответ на действия пользователя
  • составная страница, состоящая из регионы, имеющие представления, возможно, вложенные просмотров, каждый реализован как MVVP триад
  • Волшебник, закрывающий коллекцию просмотров одним кликом

Здесь есть существенная логика. Куда это денется?

Это именно то (ваш вопрос), где я получаю зависания при переносе своих вещей в MVVM, я прочитал хорошую статью, которая дала мне момент ахха, такая архитектура вписывается в большую, где какой-то класс составляет жизненный цикл. трио МВВМ

Если вы хотите прочитать полную статью здесь Уорд Белл пойдет в более подробные подробности. Возможно, это всего лишь небольшая часть общей картины, в другой замечательной статье рассматриваются основные игроки в Сложном окружении приложений, см. здесь .

Какое все это имеет отношение к вашей проблеме? Ну, я уверен, что ViewModel представляет представление, а ваше представление определяется во время выполнения, поэтому, если проблема требует наличия динамически генерируемых столбцов, это может быть обязанностью чего-то другого для создания визуализированного представления и соответствующей модели представления, которая соответствует вашему конечный результат и пример их.

1 голос
/ 18 июля 2009

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

Обычно представление знает только о свойствах внутри ViewModel, в то время как ViewModel предоставляет данные, к которым привязывается View, но на самом деле не знает ни о каких элементах виджетов / пользовательского интерфейса View. Итак, я думаю, что на самом деле я должен оставить этот код в коде позади. Код ссылается на свойства в DataContext (который установлен на ViewModel), подключается к визуальному дереву и динамически добавляет больше ветвей и листьев в дерево. Когда я это так выразился, мне вдруг показалось, что это очень «вид» :)

0 голосов
/ 27 января 2012

Я получил рабочее решение, использующее принципы MVVM и очень мало кода, надеюсь, оно поможет: Мое решение

0 голосов
/ 21 июля 2009

Теперь вопросы немного прояснены, вот еще одна попытка.

Прежде всего, графики, вероятно, лучше обрабатываются с помощью элемента управления WPF Charting в WPF Toolkit, они содержат довольно сочные вещи. Я определенно рекомендую попробовать его перед созданием пользовательских диаграмм на основе ListView.

Но в любом случае, возвращаясь к вашим уточненным вопросам. Вот где вы должны использовать либо DataTemplateSelector, либо запускать с помощью пользовательского IValueConverter, который устанавливает шаблон.

DataTemplateSelector был изобретен именно по этой причине, но на практике это немного грязно. Вам придется иметь дело с загрузкой шаблонов из ресурсов, которые немного лучше, чем XamlReader.

С IValueConverter это будет примерно так:

    <DataTemplate>
        <ContentControl x:Name="content" Content="{Binding}">
        </ContentControl>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Converter={local:TemplateChoseConverter}}" Value="SystemType">
                <Setter TargetName="content" Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock Text="[system type] "/>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Converter={local:TemplateChoseConverter}}" Value="Action">
                <Setter TargetName="content" Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Button Text="[action] "/>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

Здесь вы помещаете ContentControl в DataTemplate, а триггеры внутри DataTemplate меняют внутренний вложенный шаблон на основе вещей, рассчитанных в IValueConverter.

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

0 голосов
/ 19 июля 2009

Я не думаю, что это хорошая идея - генерировать XAML и обрабатывать его с помощью XamlReader.

Зачем ты это делаешь?

Если вы хотите, чтобы ваше представление зависело от типа данных или от определенных условий, все это достигается с помощью DataTemplate. Свойство DataType позволяет выбирать шаблон по типу. Триггеры и вложенный ContentControl могут менять шаблоны на основе условий данных.

Если вы хотите хранить настоящий XAML в базе данных, это совершенно другая история, не связанная с MVVM. Существует ряд потенциальных проблем, таких как производительность, ограничения синтаксиса XamlReader, особенности сборки / разрешения ресурсов, не в последнюю очередь безопасность.

...