Да, это возможно.Я сделал это в ситуации класса и его подклассов.Мой пример может не соответствовать вашей ситуации, но принцип вполне может применяться.
У меня есть класс A и два подкласса A, названные AB и AC.И AC, и AB обладают дополнительными свойствами, превосходящими свойства A.
. Затем существует ObservableCollection, содержащая As, AB и AC.Мне пришлось отобразить DataGrid коллекции и StackPanel для отдельных элементов элементов Collection.
Для дополнительных членов класса AB и AC я определил две статические панели StaticResource в XAML.(Мне всегда приходилось отображать элементы базового класса A, поэтому эти члены находятся за пределами этой конструкции.)
<StackPanel x:Key="AB"...../>
<StackPanel x:Key="AC"...../>
<StackPanel x:Key="Nothing"...../>
Эти StackPanels, поскольку они являются ресурсами, обычно не связываются во время выполнения: только когда и еслиони обязаны!Теперь я определяю ContentControl, привязанный к свойству с именем «SubClassPanel»:
public StackPanel SubClassPanel {get; set; etc...}
Теперь я могу программно установить SubClassPanel для любого ресурса AB или ресурса AC или пустого, фиктивного ресурса StackPanel, если вы толькохочу показать базовый класс.Вот XAML для точки вставки подкласса StackPanels:
<ContentControl Content="{Binding SubClassPanel,
Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
В моем случае изменение выполняется с помощью события DataGrid «SelectionChanged».Вот менеджер событий:
public void ChangeSection(object sender, SelectionChangedEventArgs e)
{
// sender is the datagrid
if (sender == null)
return;
// So, SelectedItem can be of class A, AB or AC:
var s = (sender as DataGrid).SelectedItem;
if (s is AB)
(s as AB).SubClassPanel = this.FindResource("AB") as StackPanel;
else
{
if (s is AC)
(s as AC).SubClassPanel = this.FindResource("AC") as StackPanel;
else
{
// or show just the base class members:
(s).SubClassPanel = this.FindResource("Nothing") as StackPanel;
}
}
}