使用Converter或DataTemplateSelector [关闭]

问题描述 投票:1回答:1

这个问题不是具体问题。这是一个关于实现以下场景的最佳方式(性能/可扩展性/可读性)的问题:

假设我有一个带有DataGrid的应用程序。这个DataGridObservableCollection<IUser>绑定。 IUser-Interface有两个实现:

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

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

c# wpf converters datatemplateselector
1个回答
0
投票
  1. 如果UI的结构是固定的,无论它与哪个数据相关联,Converter将是最佳选择。这是因为如果应用DataTemplateSelector,则每次更改数据后都将执行数据模板重新选择过程。并且在大多数情况下,这也会导致模板可视树重新生成,导致性能丢失。
  2. 如果UI的结构将根据与之关联的数据而变化,DataTemplateSelector将是最佳选择。如果没有设置ContentTemplateContentPresenter通过数据类型 - >默认模板选择来决定DataTemplate>资源搜索使用哪个DataTemplateSelector。因此,显然DataTemplateSelector将具有更好的灵活性和性能。
© www.soinside.com 2019 - 2024. All rights reserved.