这个问题不是具体问题。更多有关实现以下方案的最佳方法(性能/可扩展性/可读性)的问题:
假设我有一个带有DataGrid
的应用程序。该DataGrid
绑定到ObservableCollection<IUser>
。 IUser
接口有两个实现:
在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>
对于此类问题,更好的解决方案是什么?
答案 0 :(得分:0)
Converter
都是最佳选择。这是因为如果应用DataTemplateSelector
,则每次更改数据后都会执行数据模板重新选择过程。在大多数情况下,这还会导致模板可视化树重新生成,从而导致性能损失。DataTemplateSelector
将是最佳选择。如果未设置ContentTemplate
,则ContentPresenter
决定由DataTemplate
->数据类型->默认模板选择来使用哪个DataTemplateSelector
。因此,显然DataTemplateSelector
将具有更好的灵活性和性能。