Tôi không chắc chắn về thay thế mặc định DataTemplate, nhưng bạn có thể sử dụng một ValueConverter để vượt qua màn ToString trong trường hợp của một số loại và một chuỗi rỗng khác. Dưới đây là một số mã (lưu ý rằng các doesnt typeb TextBlock có bộ chuyển đổi vào nó để hiển thị những gì nó trông giống như bình thường):
.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
}
}
Nguồn
2009-04-03 23:56:59
"WPF phù hợp với một đối tượng với DataTemplate của mình bằng kiểu thời gian chạy chính xác" - Không đúng. Nếu bạn thêm một DataTemplate với DataType = BaseClass, nó sẽ khớp với SubClass. Tôi đã nhìn thấy nó hoạt động. Thật không may, khung công tác đặc biệt không cho phép tạo một DataTemplate cho System.Object; bạn nhận được một lỗi thời gian chạy "Các loại 'DataTemplateKey' không xây dựng. DataTemplate.DataType không thể được loại đối tượng." –
Bạn nói đúng. Tôi đã nghĩ về phong cách, mà không phải là tự động kế thừa. Cập nhật câu trả lời của tôi. Cảm ơn. –