nie jestem pewien o zastąpienie domyślnego DataTemplate, ale można użyć ValueConverter przekazać wyświetlania ToString w przypadku niektórych typów i pusty ciąg w przeciwnym przypadku. Oto niektóre kodu (należy pamiętać, że nie robi TypeB TextBlock mieć przetwornicę na to, aby pokazać, jak to wygląda normalnie):
.xaml:
<Window x:Class="EmptyTemplate.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:EmptyTemplate"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<loc:AType x:Key="atype"/>
<loc:BType x:Key="btype"/>
<loc:TypeConverter x:Key="TypeConverter"/>
</Window.Resources>
<StackPanel>
<Button Content="{Binding Source={StaticResource atype}, Converter={StaticResource TypeConverter}}"/>
<Button Content="{Binding Source={StaticResource btype}, Converter={StaticResource TypeConverter}}"/>
<TextBlock Text="{Binding Source={StaticResource atype}, Converter={StaticResource TypeConverter}}"/>
<TextBlock Text="{Binding Source={StaticResource btype}}"/>
</StackPanel>
</Window>
.xaml.cs:
namespace EmptyTemplate
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
public class AType { }
public class BType { }
public class TypeConverter : IValueConverter
{
public DataTemplate DefaultTemplate { get; set; }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value.GetType() == typeof(AType))
{
return value.ToString();
}
return DefaultTemplate;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
}
„WPF mecze obiekt z jego DataTemplate przez dokładnego typu wykonawczego” - Nieprawda. Jeśli dodasz DataTemplate z DataType = BaseClass, dopasuje on również SubClass. Widziałem, jak to działa. Niestety, framework wyraźnie uniemożliwia tworzenie DataTemplate dla System.Object; pojawia się błąd środowiska wykonawczego "Konstrukcja typu" DataTemplateKey "nie powiodła się. DataTemplate.DataType nie może być typu Object." –
Masz rację. Myślałem o stylach, które nie są automatycznie dziedziczone. Aktualizuję moją odpowiedź. Dzięki. –