akj*_*shi 11 wpf datatrigger datatemplate controltemplate datatemplateselector
我有一个通用控件,它根据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>
Run Code Online (Sandbox Code Playgroud)
现在,同样可以利用来实现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
Run Code Online (Sandbox Code Playgroud)
我觉得第二种方法,使用DataTemplateSelector
更好,但想知道你 -
哪一个更好,为什么?
两个会有任何性能差异吗?
我听说DataTemplateSelectors
如果它们的值基于更改,则不更新模板,因此我通常不使用它们.
我首选的方法实际上是使用DataTemplates.
<MyControl.Resources>
<DataTemplate TargetType="{x:Type local:BooleanModel}">
<local:BooleanView />
</DataTemplate>
<DataTemplate TargetType="{x:Type local:IntegerModel}">
<local:IntegerView />
</DataTemplate>
...
</MyControl.Resources>
Run Code Online (Sandbox Code Playgroud)
其次,如果我想基于属性而不是对象类型更改模板,我倾向于使用DataTriggers
.这是因为如果该属性发生变化,PropertyChange通知将自动告知UI它已更改并更新模板.我不相信DataTemplateSelectors
自动这样做.我也更喜欢在我的XAML中看到模板选择逻辑,而不是将它隐藏在TemplateSelector文件中,但这只是个人偏好.
我最后的选择是用一个DataTemplateSelector
.我几乎从不在WPF应用程序中使用过一个,尽管我经常在Silverlight中使用它,因为它不支持我使用隐式的优选方法DataTemplates
(尚)
我不知道两者之间有任何显着的性能差异,但如果有人能告诉我,我会感兴趣.
归档时间: |
|
查看次数: |
10180 次 |
最近记录: |