MVVM и динамическая генерация элементов управления

Я написал инструмент, который генерирует SQL-запросы с использованием GUI, я хочу переписать инструмент с использованием MVVM и WPF, каждый тип столбца sql имеет другой элемент управления, как вы можете видеть на следующем изображении

enter image description here

Я добавляю элемент управления фильтрами столбцов на основе типа столбца sql, и я генерирую элементы управления с помощью кода, как и в формах Windows.

  • в MVVM, я прочитал, что представление связано с использованием XAML, делает MVVM-пакет таким приложением, где я должен добавить другого пользователя динамически управляет панелью стека?
  • Элементы управления не будут существовать в представлении, если только один столбец не будет двойным щелчком, это означает, что элемент управления не будет доступен в xaml и не будет скрыт или скомпенсирован.
  • Есть ли способ, которым я могу избежать привязок в коде?
  • должен ли я создать пользовательский элемент управления для каждого типа столбца?
  • в общем, что лучший подход к devlop для такого приложения со сложным и динамическим ui с использованием mvvm?

Ответ 1

Думаю, я знаю, как этого достичь, но это очень сложный материал. Сначала вы должны понимать базовые концепции MVVM. Основной ViewModel должен быть классом с ObservableCollection для ViewModels, каждый из которых представляет столбец со своими данными и свойствами.

interface IViewModel : INotifyPropertyChanged,IDisposable
{
}

interface IColumnViewModel : IViewModel
{
}

class ViewModelBase : IViewModel
{
    // ... MVVM basics, PropertyChanged etc. ...
}

class MainViewModel : ViewModelBase
{
    ObservableCollection<IColumnViewModel> Columns {get; set}
}

В представлении я предполагаю что-то вроде ItemsControl с ItemTemplate, которое должно вставлять ContentControl с DataTemplate, которое должно быть автоматически выбрано WPF в соответствии с привязным DataContext элемента списка. StackPanel сам по себе не подходит, но он может быть вызван как ItemsPanelTemplate

<Window
    xmlns:v="clr-namespace:WpfApplication.Views"
    xmlns:vm="clr-namespace:WpfApplication.ViewModels">
    <Window.Resources>
        <DataTemplate DataType="{x:Type TypeName=vm:TextColumnViewModel}">
            <v:TextColumnView/>
        </DataTemplate>
    </Window.Resources>
    <ItemsControl
        ItemsSource="{Binding Columns}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

Итак, вы должны создать пару View/ViewModel для каждого типа столбца.

Надеюсь, мой пример поможет. Удачи с вашей девушкой и MVVM:)

Ответ 2

Если я правильно понял ваш сценарий: Шаблоны шаблонов данных и элементов можно использовать Например, я написал приложение, которое загружает данные в коллекцию, а затем показывает каждый элемент этой коллекции на панели Wrap Panel [или панели стека] на основе определенного шаблона данных. И элементы Wrap penel синхронизируются самой коллекцией в двух направлениях Вы должны рассмотреть возможность использования Observable Collections для достижения этой цели Затем вы можете заполнить коллекцию и просмотреть результаты в представлении Надеюсь, это поможет

Ответ 3

Чтобы написать что-то подобное в MVVM, у вас будет одно представление, скажем, ваша область содержимого. Это представление будет иметь модель представления, одним из свойств этой модели представления будет представление, или несколько свойств этой модели представления будут представлением. Требуется немного времени, чтобы обернуть голову вокруг, но если вы используете инверсию управления и впрыска зависимостей, то представление видов очень управляемо в шаблоне MVVM.

Ответ 4

Ну, ваше представление не полностью написано в XAML - вы создаете элементы управления на С#.

Я не думаю, что вы получите что-то от перезаписи и подгонки его в форму MVVM. Просто сохраните код так, как сейчас, и наслаждайтесь.