У меня есть 3 поля со списком, как показано ниже, с 3 изображениями под каждым окном со списком.

<ComboBox Name="Category1" Grid.Row="0" Grid.Column="0"
        HorizontalAlignment="Left"
        Margin="40,20,0,0"
        VerticalAlignment="Top"
        Width="120"
        Loaded="Category1_Loaded"
        SelectionChanged="Category1_SelectionChanged"/>
        <Image Width="120" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" Margin="40,40,0,0" Name="CB1" Source="C:\Users\Image1.png" />

        <ComboBox Name="Category2" Grid.Row="0" Grid.Column="1"
        HorizontalAlignment="Left"
        Margin="40,20,0,0"
        VerticalAlignment="Top"
        Width="120"
        Loaded="Category2_Loaded"
        SelectionChanged="Category2_SelectionChanged"/>
        <Image Width="120" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Left" Margin="40,40,0,0" Name="CB2" Source="C:\Users\Image2.png" />

        <ComboBox Name="Category3" Grid.Row="0" Grid.Column="2"
        HorizontalAlignment="Left"
        Margin="40,20,0,0"
        VerticalAlignment="Top"
        Width="120"
        Loaded="Category3_Loaded"
        SelectionChanged="Category3_SelectionChanged"/>
        <Image Width="120" Grid.Row="0" Grid.Column="2" HorizontalAlignment="Left" Margin="40,40,0,0" Name="CB3" Source="C:\Users\Image3.png" />

И код .cs

 private void Category1_Loaded(object sender, RoutedEventArgs e)
        {
            // ... A List.
            List<string> data = new List<string>();
            data.Add("Category1_1");
            data.Add("Category1_2");
            // ... Get the ComboBox reference.
            var comboBox = sender as ComboBox;
            // ... Assign the ItemsSource to the List.
            comboBox.ItemsSource = data;
            // ... Make the first item selected.
            comboBox.SelectedIndex = 0;
        }

private void Category2_Loaded(object sender, RoutedEventArgs e)
        {
            // ... A List.
            List<string> data = new List<string>();
            data.Add("Category2_1");
            data.Add("Category2_2");
            // ... Get the ComboBox reference.
            var comboBox = sender as ComboBox;
            // ... Assign the ItemsSource to the List.
            comboBox.ItemsSource = data;
            // ... Make the first item selected.
            comboBox.SelectedIndex = 0;
        }
private void Category3_Loaded(object sender, RoutedEventArgs e)
        {
            // ... A List.
            List<string> data = new List<string>();
            data.Add("Category3_1");
            data.Add("Category3_2");
            // ... Get the ComboBox reference.
            var comboBox = sender as ComboBox;
            // ... Assign the ItemsSource to the List.
            comboBox.ItemsSource = data;
            // ... Make the first item selected.
            comboBox.SelectedIndex = 0;
        }

Теперь 3 поля со списком и изображения, как показано ниже введите описание изображения здесь

Я хочу изменить или отобразить конкретное изображение в раскрывающемся списке выбор. например, если я выберу раскрывающееся значение Category1_1, оно должен показать мне изображение c:\users\Category1_1.PNG

0
Neo 1 Янв 2016 в 16:06

2 ответа

Лучший ответ

Вы можете привязать свойство Image Source непосредственно к SelectedItem соответствующего ComboBox с помощью Binding Converter, который преобразует строку категории в BitmapImage:

<Window.Resources>
    <local:ImageConverter x:Key="ImageConverter"/>
</Window.Resources>
...
<ComboBox x:Name="comboBox1" .../>
<Image Source="{Binding SelectedItem, ElementName=comboBox1,
                        Converter={StaticResource ImageConverter}}"/>

Конвертер будет выглядеть так:

public class ImageConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            var path = string.Format(@"C:\Users\{0}.png", value);
            return new BitmapImage(new Uri(path));
        }
        catch (Exception ex)
        {
            return null; // or some default image
        }
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

В качестве примечания, вы можете легко создать список элементов ComboBox в XAML следующим образом:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
...
<ComboBox x:Name="comboBox1" SelectedIndex="0" ...>
    <ComboBox.Items>
        <sys:String>Category1_1</sys:String>
        <sys:String>Category1_2</sys:String>
        <sys:String>Category1_3</sys:String>
    </ComboBox.Items>
</ComboBox>
1
Clemens 1 Янв 2016 в 14:47

Я не могу его сейчас протестировать, но взяв несколько примеров из MSDN, ваше выбранное измененное событие для combobox Category1 должно быть примерно таким

    private void Category1_SelectionChanged(object sender, RoutedEventArgs e)
    {
        var comboBox = sender as ComboBox;

        // Check if you have something selected (this happens sometime)
        if(comboBox.SelectedIndex != -1)
        {
            // Take the text of the combo and build the path to the file
            string fileName = Path.Combine(@"C:\users", comboBox.Text + ".png"); 

            // Again, check if we really have that file available
            if(File.Exists(fileName))
            {
                // Build a BitmapImage from the file
                BitmapImage bi = new BitmapImage();
                bi.BeginInit();
                bi.UriSource = new Uri(fileName, UriKind.Relative);
                bi.EndInit();

                // Set the Image for this combo. Not sure if the Stretch part is needed
                CB1.Stretch = Stretch.Fill;
                CB1.Source = bi3;
            } 
        }
    }

Ссылка из MSDN:

Свойство Image.Source
Свойство ComboBox.Text

Кроме того, я не уверен, работает ли чтение свойства Text должным образом (возможные проблемы, вызванные свойством ComboBox IsEditable). В любом случае вы можете использовать SelectedItem.ToString ()

Если вы сделаете эту работу для комбо Category1, то его можно легко преобразовать в общий метод для всех трех комбо, передающих комбо, порождающее событие, и изображение для обновления.

1
Steve 1 Янв 2016 в 13:39