ControlTmplate与DataTrigger相比.DataTemplate与DataTemplateSelector

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,DataTemplateDataTemplateSelector这样的-

<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更好,但想知道你 -

  • 哪一个更好,为什么?

  • 两个会有任何性能差异吗?

Rac*_*hel 9

我听说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(尚)

我不知道两者之间有任何显着的性能差异,但如果有人能告诉我,我会感兴趣.

  • 这并非总是如此.如果ContentPresenter的Content = {Binding Path = SomeProp},那么如果SomeProp发生更改,ContentPresenter将再次向TemplateSelector请求模板.但是,如果SomeProp不更改但该对象的属性发生更改,则您将无法再次调用模板选择器. (4认同)