#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, но я думаю, что это не ваша область.