ContentControl
создает элемент управления и выбирает для него правильный DataTemplate
в зависимости от его типа. Таким образом, вам не нужен конвертер:
<ContentControl Content="{Binding Child}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:Type1}">
<Label Content="{Binding ItemText}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Type2}">
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding ItemText}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
Этот код реагирует на различные типы свойства Child
внутри ВМ:
public BaseType Child { get; set; }
Типы данных:
public class BaseType { }
public class Type1 : BaseType
{
public string ItemText { get; set; }
}
public class Type2 : BaseType
{
public ObservableCollection<Type1> Items { get; } = new ObservableCollection<Type1>();
}
например, если вы установите Child
на Type1
, он покажет вам одну метку
Child = new Type1 { ItemText = "hello" };
или если вы установите его на Type2
, у вас будет ваша коллекция радиокнопок:
var t = new Type2();
t.Items.Add(new Type1 { ItemText = "hello" });
t.Items.Add(new Type1 { ItemText = "world" });
Child = t;