这个问题不是具体问题。这是一个关于实现以下场景的最佳方式(性能/可扩展性/可读性)的问题:
假设我有一个带有DataGrid
的应用程序。这个DataGrid
与ObservableCollection<IUser>
绑定。 IUser
-Interface有两个实现:
在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>
对于这类问题,有什么更好的解决方案?
Converter
将是最佳选择。这是因为如果应用DataTemplateSelector
,则每次更改数据后都将执行数据模板重新选择过程。并且在大多数情况下,这也会导致模板可视树重新生成,导致性能丢失。DataTemplateSelector
将是最佳选择。如果没有设置ContentTemplate
,ContentPresenter
通过数据类型 - >默认模板选择来决定DataTemplate
>资源搜索使用哪个DataTemplateSelector
。因此,显然DataTemplateSelector
将具有更好的灵活性和性能。