Существует много возможностей для улучшения вашего дизайна, например, вы должны иметь Enumeration
в качестве столбцов вместо 40 различных именованных объектов.
Но даже с вашим текущим дизайном вы можете реализовать IValueConverter
, который напрямую преобразует значение в правильный URI изображения, а затем вы можете привязать Image
непосредственно к вашему исходному значению через конвертер.
Вне моей головы, не проверено:
Написать конвертер:
<ValueConversion(GetType(Double), GetType(String))>
Public Class MyValueToImageConverter
Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
Try
If CDbl(value) = 0.0 Then Return "../Resources/pmIcons/minus-256.png"
If CDbl(value) = 1.0 Then Return "../Resources/pmIcons/greenRoundTick.png"
If CDbl(value) = 2.0 Then Return "../Resources/pmIcons/redCross.png"
Catch ex As Exception
'this is okay for our purpose
End Try
Return "../Resources/Help.png"
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
Throw New NotImplementedException()
End Function
End Class
Вставить в ваши ресурсы (Window
или Page
и т. Д.)
<Window.Resources>
<local:MyValueToImageConverter x:Key="myConverter"/>
</Window.Resources>
И связывайте свои столбцы так:
<Image Source="{Binding Col1,Converter={StaticResource myConverter}}" />
Затем вы можете обернуть эту функцию в UserControl
, используя зловещий «тег» DependencyProperty
<UserControl
x:Class="StatusIcon"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp1"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d"
>
<UserControl.Resources>
<local:MyValueToImageSourceConverter x:Key="_conv" />
</UserControl.Resources>
<Image Source="{Binding Tag, RelativeSource={RelativeSource AncestorType={x:Type local:StatusIcon}}, Converter={StaticResource _conv}}" />
</UserControl>
И в итоге получится что-то такое же аккуратное и чистое, как это:
<local:StatusIcon Tag="{Binding Col1}"/>
Затем вы можете улучшить это, заменив Tag своим собственным DependencyProperty
с именем Value или чем-то похожим