Используйте X: Array для хранения элементов изображения WPF ComboBox - PullRequest
0 голосов
/ 05 мая 2018

Я определяю двумерные массивы XAML в Словаре ресурсов для хранения содержимого данных WPF ComboBox следующим образом ...

 <x:Array x:Key="ThreatLevelArray" Type="{x:Type local:ThreatLevel}">
    <local:ThreatLevel ThreatLevelName="Very Low" ThreatLevelNumber="0" />
    <local:ThreatLevel ThreatLevelName="Low" ThreatLevelNumber="1" />
</x:Array>

Массив поддерживается этим классом в коде позади ...

public class ThreatLevel
{
    public int ThreatLevelNumber { get; set; }
    public string ThreatLevelName { get; set; }
}

ComboBox отображает «ThreatLevelName» и обновляет поле «ThreatLevel» в базе данных значением, предоставленным «ThreatLevelNumber».

<ComboBox x:Name="threatLevelComboBox" DisplayMemberPath="ThreatLevelName" IsEditable="True"
          IsReadOnly="True"
          ItemsSource="{StaticResource ThreatLevelArray}"
          SelectedValue="{Binding Path=ThreatLevel, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"
          SelectedValuePath="ThreatLevelNumber"
          Style="{StaticResource ComboBoxStyle}" />

Это все работает, но я хочу иметь возможность отображать изображение вместо текста "ThreatLevelName". Я пытался ....

public class ThreatLevel
{
    public int ThreatLevelNumber { get; set; }
    public string ThreatLevelName { get; set; }
    public Image ThreatLevelImage { get; set; }
}

Но следующее дает мне ошибку "TypeConverter для" Image "не поддерживает преобразование из строки".

 <x:Array x:Key="ThreatLevelArray" Type="{x:Type local:ThreatLevel}">
    <local:ThreatLevel ThreatLevelName="Very Low" ThreatLevelNumber="0" ThreatLevelImage="/RMS_EF6;component/RMS_Images/VeryLow.png"/>
    <local:ThreatLevel ThreatLevelName="Low" ThreatLevelNumber="1" ThreatLevelImage="/RMS_EF6;component/RMS_Images/Low.png"/>
</x:Array>

Как я могу устранить эту ошибку и использовать эту процедуру для создания ComboBox, как показано ниже ...

<ComboBox x:Name="threatLevelComboBox" DisplayMemberPath="ThreatLevelImage" IsEditable="True"
          IsReadOnly="True"
          ItemsSource="{StaticResource ThreatLevelArray}"
          SelectedValue="{Binding Path=ThreatLevel, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"
          SelectedValuePath="ThreatLevelNumber"
          Style="{StaticResource ComboBoxStyle}" />

1 Ответ

0 голосов
/ 05 мая 2018

Анализатор XAML преобразует строку пути изображения в BitmapFrame, а не в элемент Image. Это делается путем неявного преобразования типа из строки в ImageSource, выполняемого классом ImageSourceConverter.

Используйте ImageSource в качестве типа вашего ThreatLevelImage свойства

public class ThreatLevel
{
    public int ThreatLevelNumber { get; set; }
    public string ThreatLevelName { get; set; }
    public ImageSource ThreatLevelImage { get; set; }
}

и вместо установки DisplayMemberPath используйте элемент Image в ItemTemplate ComboBox:

<ComboBox ...>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding ThreatLevelImage}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...