有没有办法在WPF中使用数据模板继承?

Fra*_*rus 49 wpf xaml datatemplate

是否有可能具有DataTemplate组合或继承(类似于样式中的"BasedOn")?有两个我需要的实例.

  1. 对于继承的类:我有一个带有几个继承类的基类.我不想在每个派生类中复制基类模板DataTemplate.

  2. 不同的视图:对于同一个类,我想定义一个datatemplate,然后根据需要添加到该模板.防爆.基本模板将显示对象中的数据,然后我想要不同的模板,可以对对象执行不同的操作,同时显示数据(继承基本模板).

Liz*_*Liz 44

我发现这件事的唯一事情就是这样:

<DataTemplate x:Key="BaseClass">
  <!-- base class template here -->
</DataTemplate>
<DataTemplate DataType="{x:Type app:BaseClass}">
  <ContentPresenter Content="{Binding}" 
                    ContentTemplate="{StaticResource BaseClass}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type app:DerivedClass}">
  <StackPanel>
    <ContentPresenter Content="{Binding}" 
                      ContentTemplate="{StaticResource BaseClass}"/>
    <!-- derived class extra template here -->
  </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

基本上,这会创建一个"公共"模板,可以使用密钥(在本例中为BaseClass)进行引用.然后我们为基类和任何派生类定义真正的DataTemplate.派生类模板然后将添加它自己的"东西".

有一段时间在msdn上讨论过这个问题,但没有人想出一个更好的解决方案.


Mar*_*eIV 22

@Fragilerus和@Liz,实际上我觉得我确实想出了更好的东西.这是另一种方法,它不仅避免了额外的ContentPresenter绑定,而且还消除了在模板中应用模板的需要,因为共享内容是在编译时设置的直接内容.在运行时发生的唯一事情是您在直接内容中设置的绑定.因此,与其他解决方案相比,这大大加快了UI的速度.

<!-- Content for the template (note: not a template itself) -->
<Border x:Shared="False" 
        x:Key="Foo" 
        BorderBrush="Red" 
        BorderThickness="1" 
        CornerRadius="4">
    <TextBlock Text="{Binding SomeProp}" />
</Border>

<DataTemplate x:Key="TemplateA">
    <!-- Static resource - No binding needed -->
    <ContentPresenter Content="{StaticResource Foo}" /> 
</DataTemplate>

<DataTemplate x:Key="TemplateB">
    <!-- Static resource - No binding needed -->
    <ContentPresenter Content="{StaticResource Foo}" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

重要提示:请确保x:Shared在共享内容上使用该属性,否则无效.

WPF的方式

上面说过,这真的不是WPF最友好的方式来做你想要的事情.这可以使用DataTemplateSelector类来实现,该类完全正确...根据您设置的标准选择数据模板.

例如,您可以轻松地设置一个查找已知数据类型的内容,并为它们返回相同的DataTemplate,但对于所有其他类型,它将回退到系统以解析DataTemplate.这就是我们在这里真正做的事情.

希望这可以帮助!:)

  • 我很困惑。该解决方案似乎是将内容堆叠在一起,而不是通过细微调整(即继承)来减少代码。 (2认同)