有没有办法在WPF中使用数据模板inheritance?
是否有可能有DataTemplate
组合或inheritance(类似于样式“BasedOn”)? 有2个我需要的情况。
-
对于inheritance类:我有一个基类与几个inheritance类。 我不想在每个派生类的
DataTemplate
复制基类模板。 -
不同的视图:对于同一个类,我想定义一个数据模板,然后根据需要添加到该模板。 防爆。 基本模板将在对象中显示数据,然后我需要不同的模板,可以在对象上执行不同的操作,同时显示数据(inheritance基模板)。
我唯一能find的就是这样的事情:
<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>
基本上这创build了一个“公共”模板,可以使用一个键(在这种情况下是BaseClass)引用。 然后我们为基类和任何派生类定义真正的DataTemplate。 派生类模板会添加它自己的“东西”。
在msdn上有一些关于这个问题的讨论,但没有人提出一个更好的解决scheme。
@Fragilerus和@Liz,其实我觉得我确实想出了一些更好的东西。 这里有另一种方法,不仅避免了额外的ContentPresenter绑定,而且也消除了在模板中应用模板的需要,因为共享内容是在编译时设置的直接内容。 运行时唯一会发生的情况是您在直接内容中设置的绑定。 因此,与其他解决scheme相比,这大大加快了用户界面的速度。
<!-- 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>
重要提示:确保在共享内容上使用x:Shared
属性,否则这将不起作用。
WPF的方式
上面说过,这实际上并不是WPF友好的方式来做你以后的事情。 这可以通过使用DataTemplateSelector类来实现,该类完全按照您设置的任何标准来select数据模板。
例如,你可以很容易地设置一个查找你已知的数据types,并为它们返回相同的DataTemplate,但是对于所有其他types,它回退到系统来parsingDataTemplate。 这就是我们在这里所做的。
希望这可以帮助! 🙂