使用Converter或DataTemplateSelector

时间:2019-04-18 06:31:42

标签: c# wpf converters datatemplateselector

这个问题不是具体问题。更多有关实现以下方案的最佳方法(性能/可扩展性/可读性)的问题:

假设我有一个带有DataGrid的应用程序。该DataGrid绑定到ObservableCollection<IUser>IUser接口有两个实现:

  • NormalUser
  • 管理员

DataGrid中,我想有一个DataGridColumn,对于具体的IUser类型,它应该显示不同的图像。

第一个解决方案

我可以使用IValueConverter来解决这个问题,

<DataGridTemplateColumn Width="Auto">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Source="{Binding Converter={converters:UserImageConverter}}" Width="16" Height="16" Margin="5,0,5,0"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

第二个解决方案

或者我可以使用DataTemplateSelector来解决这个问题,

<DataGridTemplateColumn Width="Auto">
    <DataGridTemplateColumn.CellTemplateSelector>
        <templateSelectors:UserImageTemplateSelector>
            <templateSelectors:UserImageTemplateSelector.NormalTemplate>
                <DataTemplate>
                    <codeBase:ImageWithGray Source="pack://application:,,,/App.UI.Resources;component/Graphics/User.png" Width="16" Height="16" Margin="5,0,5,0" />
                </DataTemplate>
            </templateSelectors:UserImageTemplateSelector.NormalTemplate>
            <templateSelectors:UserImageTemplateSelector.AdminTemplate>
                <DataTemplate>
                    <codeBase:ImageWithGray Source="pack://application:,,,/App.UI.Resources;component/Graphics/Admin.png" Width="16" Height="16" Margin="5,0,5,0" />
                </DataTemplate>
            </templateSelectors:UserImageTemplateSelector.AdminTemplate>
        </templateSelectors:UserImageTemplateSelector>
    </DataGridTemplateColumn.CellTemplateSelector>
</DataGridTemplateColumn>

对于此类问题,更好的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

  1. 如果UI的结构是固定的,无论与之关联的数据是什么,Converter都是最佳选择。这是因为如果应用DataTemplateSelector,则每次更改数据后都会执行数据模板重新选择过程。在大多数情况下,这还会导致模板可视化树重新生成,从而导致性能损失。
  2. 如果UI的结构将根据与其关联的数据而变化,则DataTemplateSelector将是最佳选择。如果未设置ContentTemplate,则ContentPresenter决定由DataTemplate->数据类型->默认模板选择来使用哪个DataTemplateSelector。因此,显然DataTemplateSelector将具有更好的灵活性和性能。