Задать вопрос
@humster
С#, Matlab, вторичная оптика для светодиодов

Как автоматически создавать UIElement при задании свойства Content?

У меня в программе есть классы, объекты которых я бы хотел редактировать в интерфейсы. Классов произвольное число , соответственно, с разным набором редактируемых полей. Редактирование этих объектов должно происходить в одном окне.
Свойство Content какой-либо панели в окне "связывается" с источником таких объектов и в зависимости от типа текущего объекта автоматически генерируется контрол.
Т.е. я хочу определить классы, объекты которых можно было бы помещать в свойство Content, в результате чего, в интерфейсе, создавался бы контрол а не результат вызова метода ToString. Каким образом можно это реализовать?
К примеру можно сделать эти классы наследниками панели или юзер контрола, в этом случае, я так понимаю, проблема будет решена. Но хотелось бы ограничиться реализацией какого-либо интерфейса или метода, т.к. по смыслу эти классы не являются ни панелью ни юзер контролом.
  • Вопрос задан
  • 219 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@Sumor
Насколько я понял вам подойдёт ItemsControl с описанным в ItemTemplate шаблоном на основе вашего класса. Можно указать несколько шаблонов для каждого класса или описать ItemsTemplateSelector, который будет выбирать шаблон по любому критерию.
По сути шаблон как раз и генерирует нужный вам UIElement.
Принципы работы следующие: в XAML описывается ItemsControl с нужными вам шаблонами ItemTemplate.
В ItemsControl используете свойство Items, чтобы добавлять/удалять элементы в список или можно (и чаще всего нужно) использовать ItemsSource. Добавлять можно элементы разных классов. Для каждого объекта будет искаться соответствующий шаблон и на его основе генерировать UIElementы.
Литература для прочтения:
Общие сведения о шаблонах данных
Небольшой пример:
<ItemsControl ItemsSource="{Binding Path=MixedList}">
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type local:MyFirstClass}">
            <StackPanel><TextBox Text="{Binding Name}" /></StackPanel>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:MySecondClass}">
              <StackPanel>
                 <TextBox Text="{Binding Property1}" />
                 <TextBox Text="{Binding Property2}" />
               </StackPanel>
        </DataTemplate>
    </ItemsControl.Resources>
</ItemsControl>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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