Лучший способ добавить управление во время выполнения

#c# #wpf #mvvm

#c# #wpf #mvvm

Вопрос:

Я ищу лучший способ добавить элементы управления WPF во время выполнения. Я объясню.

  • При запуске приложения я хотел бы выполнить поиск некоторых данных и на основе этих данных создать некоторые элементы управления пользовательского интерфейса.

Простой пример

  • Запустить приложение
  • Выполните поиск конфигурации (в базе данных)
  • Создавать или нет какой-либо элемент управления на основе конфигурации.

Способом, отличным от MVVM, я просто создаю цикл для создания или записи этих элементов управления. Но я понятия не имел, как это сделать по шаблону MVVM.

Моей первоначальной идеей было создать все возможные элементы управления и показывать или нет на основе конфигурации. Это лучший способ?

Спасибо 🙂

Комментарии:

1. Привязать результат к ItemsControl

2. ItemsControl — это один из способов использования простых приложений: wpf-tutorial.com/list-controls/itemscontrol , Другим способом вы можете обратиться к Prism : prismlibrary.com/docs

3. Можете ли вы привести несколько примеров того, какие типы и сколько элементов управления вы ожидаете показать? Какой примерно макет? (Это список? пользовательский экран? что-то еще?)

4. Я буду искать ItemsControl.

5. @UuDdLrLrSs Это серия кнопок переключения в клиентском приложении OPC UA. Я бы хотел, чтобы приложение проверяло в БД, какие логические теги перечислены, и создавало кнопку переключения для каждого из них. Например: foreach (тег в тегах) { list.add(новая кнопка (Tag.Name ) } и после этого добавьте все кнопки внутри списка на экране.

Ответ №1:

Я ищу лучший способ добавить элементы управления WPF во время выполнения.

Если вы не используете code-behind, я думаю, что создание шаблонов данных — это именно то, что вам нужно.

Я бы хотел, чтобы приложение проверяло в БД, какие логические теги перечислены, и создавало кнопку переключения для каждого из них.

Вы можете сделать это с помощью ItemsControl и DataTemplate s. Создайте класс данных для каждого типа элемента управления, который вы хотите отобразить, например, a, ToggleButton который будет иметь bool свойство для переключаемого состояния и заголовок. Всегда следите за тем, чтобы реализовать INotifyPropertyChanged отражение изменений в данных в пользовательском интерфейсе.

 public class MyToggleDataType : INotifyPropertyChanged
{
   private bool _isToggled;
   private string _title;

   public bool IsToggled
   {
      get => _isToggled;
      set
      {
         if (_isToggled == value)
            return;

         _isToggled = value;
         OnPropertyChanged();
      }
   }

   public string Title
   {
      get { ... }
      set { ...}
   }

   public event PropertyChangedEventHandler PropertyChanged;

   protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }
}
  

Предоставьте коллекцию всех элементов данных, которые вы хотите отобразить в качестве элемента управления в вашей основной модели представления. ObservableCollection Автоматически уведомляет об изменениях, таких как добавление или удаление элементов. Я использую коллекцию object , но вы могли бы также использовать базовый класс ваших элементов данных здесь.

 public ObservableCollection<object> MyDataItems { get; }
  

Вам нужно обязательно либо инициализировать эту коллекцию перед ее использованием в пользовательском интерфейсе, либо реализовать INotifyPropertyChanged , чтобы сигнализировать о ее изменении, если вы назначите ее позже.

В вашем XAML создайте ItemsControl и добавьте DataTemplate для каждого типа данных элемента, который вы указываете в DataType свойстве. DataTemplate содержит элементы управления, которые должны отображаться, а также все привязки к соответствующему элементу данных. Привяжите ItemsSource из ItemsControl к вашей MyDataItems коллекции.

 <ItemsControl ItemsSource="{Binding MyDataItems}">
   <ItemsControl.Resources>
      <DataTemplate DataType="{x:Type local:MyDataType}">
         <ToggleButton IsChecked="{Binding IsToggled}"
                       Content="{Binding Title}"/>
      </DataTemplate>
   </ItemsControl.Resources>
</ItemsControl>
  

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

Кстати, если вы хотите сделать это с помощью отдельных элементов управления, вы можете использовать ContentControl , который работает таким же образом: предоставить свойство модели представления, привязать его к Content свойству и создать шаблон данных для его отображения. Для продвинутых сценариев, где вам нужно создавать сложные представления и навигацию, вы можете захотеть использовать MVVM-фреймворк, такой как Caliburn.Micro, Stylet или Prism, но я думаю, что это не ваша область.