【发布时间】:2012-02-14 02:38:50
【问题描述】:
我有一个通用控件,它根据 ViewModel 中的 type 属性显示一个编辑器。目前它是使用Control、ControlTemplate 和DataTrigger 实现的,就像这样 -
<Control
x:Name="MainControl"
Grid.Column="1"
TargetUpdated="OnTargetUpdated">
<Control.Style>
<Style>
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=EditorType}"
Value="{x:Static view:EditorType.Bool}">
<Setter
Property="Control.Template"
Value="{StaticResource boolTemplate}" />
</DataTrigger>
<DataTrigger
Binding="{Binding Path=EditorType}"
Value="{x:Static view:EditorType.Text}">
<Setter
Property="Control.Template"
Value="{StaticResource textTemplate}" />
</DataTrigger>
<DataTrigger
Binding="{Binding Path=EditorType}"
Value="{x:Static view:EditorType.Integer}">
<Setter
Property="Control.Template"
Value="{StaticResource integerTemplate}" />
</DataTrigger>
...
....
</Style.Triggers>
</Style>
</Control.Style>
</Control>
现在,可以像这样使用ContentPresenter、DataTemplate 和DataTemplateSelector 来实现相同的功能-
<local:EditorTemplateSelector
BoolEditorTemplate="{StaticResource boolTemplate}"
TextEditorTemplate="{StaticResource textTemplate}"
IntegerEditorTemplate="{StaticResource integerTemplate}"
...
....
x:Key="EditorTemplateSelector">
</local:EditorTemplateSelector>
<ContentPresenter
ContentTemplateSelector="{Binding Source={StaticResource EditorTemplateSelector}}"
Content="{Binding}"
TargetUpdated="OnTargetUpdated">
</ContentPresenter>
// Template selector returning appropriate template based on type
我觉得第二种方法,使用DataTemplateSelector 更好,但想知道你 -
哪个更好,为什么?
两者会有性能差异吗?
【问题讨论】:
-
据我所知,第二种方式被认为是最佳实践。它也更具可读性,因为它不包含选择逻辑(应始终在 C# 中定义)。不过,我对性能点也很感兴趣。
标签: wpf datatemplate controltemplate datatrigger datatemplateselector