带有DataTrigger的ControlTemplate与带有DataTemplateSelector的DataTem

本文关键字:DataTemplateSelector DataTem DataTrigger ControlTemplate 带有 | 更新日期: 2023-09-27 18:20:52

我有一个通用控件,它根据ViewModel中的类型属性显示编辑器。目前,它是使用ControlControlTemplateDataTrigger实现的,就像这样-

<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>

现在,使用像这样的ContentPresenterDataTemplateDataTemplateSelector也可以实现相同的效果-

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

  • 哪一个更好,为什么
  • 两者的性能会有什么不同吗

带有DataTrigger的ControlTemplate与带有DataTemplateSelector的DataTem

我听说,如果DataTemplateSelectors所基于的值发生变化,它们不会更新模板,因此我通常不会使用它们。

我的首选方法实际上是使用DataTemplates。

<MyControl.Resources>
    <DataTemplate TargetType="{x:Type local:BooleanModel}">
        <local:BooleanView />
    </DataTemplate>
    <DataTemplate TargetType="{x:Type local:IntegerModel}">
        <local:IntegerView />
    </DataTemplate>
    ...
</MyControl.Resources>

其次,如果我想根据属性而不是对象类型更改模板,我倾向于使用DataTriggers。这是因为,如果该属性发生更改,PropertyChange通知将自动通知UI它已更改并更新模板。我不相信DataTemplateSelectors会自动做到这一点。我也更喜欢在XAML中看到模板选择逻辑,而不是将其隐藏在TemplateSelector文件中,但这只是个人偏好。

我最后的选择是使用DataTemplateSelector。我几乎从来没有在WPF应用程序中使用过一个,尽管我经常在Silverlight中使用,因为它不支持我喜欢的使用隐式DataTemplates(目前)的方法

我不知道两者之间有任何显著的性能差异,尽管如果有人能告诉我其他情况,我会很感兴趣。

这里有两个问题:)

  1. XAMLDataTriggers)或代码TemplateSelector中的何处作出决定
  2. 你是在覆盖整个Style还是仅仅覆盖DataTemplate。在第一个示例中,覆盖Style,在第二个示例中覆盖DataTemplate

这是我的2c:

我会坚持使用触发器,因为你会获得无与伦比的灵活性级别——一个新资源价格的新编辑器和一个XAML中的触发器——还有什么更好的呢?有一个潜在的警告,与DataTrigger的使用有关——它可能会导致数据泄露。

谈到StyleDataTemplate的选择,我再次坚持使用Style。从树的角度来看,它可能有点重,但它会让你最终控制编辑器的外观。

特别是,某些属性只能使用Style SettersStyle级别上定义。定义@DataTemplate级别根本不起作用,因为DataTemplate内容不是控件容器的直接子级(还有一个额外的级别-actula控件)。如果你没有这样的属性,ControlTemplates也很好,而且可能更快(?)。

我也不喜欢DataTemplateSelector,但我想如果选择器评估包含而不是类型检查,则可以使用它们,例如if x>5 && dayOfWeek==Tue && isFullMoon(today)然后是template1。

我建议答案更多的是:你认为control是必要的吗。使用control可以获得一大堆功能,而使用DataTemplate则无法获得这些功能。你可以添加DependencyPropertieseventsfunctions等。但你需要这个吗?如果你不这样做,那么控制可能是过度的。

相关文章:
  • 没有找到相关文章