1

Во ViewModel имеется ObservableCollection <Applicant>. Эта коллекция является источником для ListBox во View.


Проблема в у меня том, что тип Applicant является классом, который содержит в себе объекты других классов(Композиция). Например там могут быть объекты Person(физ. лицо) или Organization(юр.лицо). Какой-то из этих объектов будет инициализирован, а какой-то иметь null.


Эта коллекция ищет шаблон отображения элемента коллекции в ресурсах(в xaml) c DataType="{x:Type Applicant}". Но я не могу в одном шаблоне описать отображение данных разных объектов в этой коллекции.


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

alex6327
  • 118
  • Удалось разобраться? – aepot Feb 05 '22 at 14:46
  • 1
    Да, спасибо. Немного повозился еще со свойством, привязанному к SelectedItem. В общем через ContentControl сделал его отображение в новом окне. Все получилось, спасибо! – alex6327 Feb 06 '22 at 19:55

1 Answers1

1

Примерно так это делается, размечается DataTemplate на каждый тип вьюмодели. Во вьюмоделях должно быть реализовано наследование, то есть Person и Organization должны быть наследниками общего базового класса.

public class Card : INotifyPropertyChanged // или BaseViewModel, в общем INPC реализация
{
    // общие для обоих наследников свойства
}

public class Person : Card { }

public class Organization : Card { }

Главная VM

public class MainViewModel : INotifyPropertyChanged
{
    private Card _card
    public Card Card
    {
        get => _card;
        set
        {
            _card = value;
            OnPropertyChanged();
        }
    }
//...

}

UI

<Grid>
    <Grid.Resources>
        <DataTemplate DataType="{x:Type Person}">
            <!-- контролы для персоны -->
        </DataTemplate>
        <DataTemplate DataType="{x:Type Organization}">
            <!-- контролы для организации -->
        </DataTemplate>
    </Grid.Resources>
    <ContentPresenter Content="{Binding Card}"/>
</Grid>

Презентер можно обернуть в любую разметку, которая вам нужна вокруг карточки. Как разнести шаблоны по разным XAML файлам, смотрите по ссылке в начале этого ответа.

aepot
  • 49,560