指定默认的空DataTemplate而不是默认的'ToString()'DataTemplate

J W*_*J W 10 c# wpf default datatemplate

wpf应用程序中的默认DataTemplate显示.ToString()方法的结果.我正在开发一个默认的DataTemplate应该不显示的应用程序.

我试过了:

<Grid.Resources>
  <DataTemplate DataType="{x:Type System:Object}">
   <Grid></Grid>
  </DataTemplate>
</Grid.Resources>
Run Code Online (Sandbox Code Playgroud)

但这不起作用.有没有人知道如果没有为应用程序中的每个类类型指定特定的DataTemplate,这是否可行?

Gre*_*som 7

如果您使用的是 MVVM 模式并且有一个所有 ViewModel 类都从其派生的抽象类,则可以使用该类而不是 System.Object:

<Grid.Resources>
    <DataTemplate DataType="{x:Type vm:VMBase}">
    </DataTemplate>
</Grid.Resources>
Run Code Online (Sandbox Code Playgroud)

  • 你刚刚救了我的命。嗯,当然不是字面上的,但这正是我正在寻找的 (2认同)

Ken*_*art 6

我知道没有办法做到这一点。根据下面 Joe 的评论,WPF 特别不允许DataTemplate为 type指定 a Object

根据您的确切要求,搜索DataTemplate与特定类型匹配的可能更容易。如果您找到了,请使用它。否则,不显示任何内容。例如:

<ContentControl Content="{Binding YourContent}" ContentTemplateSelector="{StaticResource MyContentTemplateSelector}"/>
Run Code Online (Sandbox Code Playgroud)

在您的选择器中(显然是伪代码):

var dataTemplateKey = new DataTemplateKey() { DataType = theType; };
var dataTemplate = yourControl.FindResource(dataTemplateKey);

if (dataTemplate != null)
{
    return dataTemplate;
}

return NulloDataTemplate;
Run Code Online (Sandbox Code Playgroud)

  • “WPF 按确切的运行时类型将对象与其 DataTemplate 相匹配”——不正确。如果添加 DataType=BaseClass 的 DataTemplate,它也会匹配 SubClass。我已经看到它起作用了。不幸的是,该框架特别不允许为 System.Object 制作 DataTemplate;您会收到运行时错误“'DataTemplateKey' 类型的构造失败。DataTemplate.DataType 不能是对象类型。” (2认同)