wpf应用程序中的默认DataTemplate显示.ToString()
方法的结果。我正在开发一个默认DataTemplate应该不显示任何内容的应用程序。
我试过了:
<Grid.Resources>
<DataTemplate DataType="{x:Type System:Object}">
<Grid></Grid>
</DataTemplate>
</Grid.Resources>
但这不起作用。有没有人知道如果没有为应用程序中的每个类类型指定特定的DataTemplate,这是否可行?
答案 0 :(得分:4)
我知道无法做到这一点。根据Joe在下面的评论,WPF明确禁止为类型DataTemplate
指定Object
。
根据您的具体要求,可能更容易搜索与特定类型匹配的DataTemplate
。如果找到一个,请使用它。否则,什么都不显示。例如:
<ContentControl Content="{Binding YourContent}" ContentTemplateSelector="{StaticResource MyContentTemplateSelector}"/>
在您的选择器中(显然是伪代码):
var dataTemplateKey = new DataTemplateKey() { DataType = theType; };
var dataTemplate = yourControl.FindResource(dataTemplateKey);
if (dataTemplate != null)
{
return dataTemplate;
}
return NulloDataTemplate;
答案 1 :(得分:4)
如果您正在使用MVVM模式并且具有一个所有ViewModel类派生自的抽象类,则可以使用该类而不是System.Object:
<Grid.Resources>
<DataTemplate DataType="{x:Type vm:VMBase}">
</DataTemplate>
</Grid.Resources>
答案 2 :(得分:3)
我使用Nullable,为我的情况工作。
<DataTemplate DataType="{x:Type sys:Nullable}">
<!-- Content -->
</DataTemplate>
答案 3 :(得分:1)
我不确定是否要替换默认的DataTemplate,但是在某些类型的情况下可以使用ValueConverter传递显示ToString,否则使用空字符串。这里有一些代码(请注意,typeb文本块上没有转换器来显示它通常的样子):
的.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
}
}
答案 4 :(得分:0)
这是一个关于如何使用选择器执行此操作的示例(IMO的最佳方式):
public class EmptyDefaultDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item != null)
{
var dataTemplateKey = new DataTemplateKey(item.GetType());
var dataTemplate = ((FrameworkElement) container).TryFindResource(dataTemplateKey);
if (dataTemplate != null)
return (DataTemplate) dataTemplate;
}
return new DataTemplate(); //null does not work
}
}
答案 5 :(得分:0)
` typeof(object)
这是我用来绑定到ContentControl的datacontext的设备。
public object MySelectedItem
{
get { return (object)GetValue(Property1Property); }
set { SetValue(Property1Property, value); }
}
public static readonly DependencyProperty Property1Property
= DependencyProperty.Register(
"MySelectedItem",
typeof(object),
typeof(PromotionsMenu),
new PropertyMetadata(false)
);
像这样使用:
MySelectedItem = SomeEntity;
我发现我也可以这样使用它:
MySelectedItem = "some text";
contextcontrol会打印一些文本作为其上下文。
MySelectedItem = "";
适用于完全空白的环境。
`