WPF: Как привязать данные ComboBox к списку ListView и установить диапазон значений ComboBox? - PullRequest
0 голосов
/ 02 июля 2018

Я новичок в земле WPF и у меня следующий вопрос относительно привязки данных.

Мое тестовое приложение содержит ListView с автомобилями (столбцы: тип, скорость и цвет). Под списком есть несколько элементов управления для выбора значений выбранного автомобиля. Среди прочего есть ComboBox для выбора цвета выбранного автомобиля.

Мое тестовое приложение выглядит следующим образом

В XAML ListView инициализируется следующим образом:

    <ListView Grid.Row="1" Name="listView"  ItemsSource="{Binding Model.Cars}" SelectedValue="{Binding Model.SelectedCar}">
  <ListView.View>
    <GridView>
      <GridView.Columns>
        <GridViewColumn Header="Type" Width="Auto" DisplayMemberBinding="{Binding Name}" />
        <GridViewColumn Header="Speed" Width="Auto" DisplayMemberBinding="{Binding Speed}" />
        <GridViewColumn Header="Color" Width="Auto"
                        DisplayMemberBinding="{Binding Color.Value}"/>
      </GridView.Columns>
    </GridView>
  </ListView.View>
</ListView>

ItemsSource - Model.Cars, который представляет собой ObservableCollection объектов Car. Car.Color - это KeyValuePair (Color, string), который инициализируется с помощью AvailableColors класса CarColors:

  public static class CarColors
  {
    static Random rnd = new Random();

    private static Dictionary<Color, string> availableColors = new Dictionary<Color, string>
    {
      { Colors.Red,  "red" },
      { Colors.Green,  "green" },
      { Colors.Blue,  "blue" },
      { Colors.Yellow,  "yellow" },
      { Colors.Brown,  "brown" },
      { Colors.Silver,  "silver" },
    };

    public static Dictionary<Color, string> GetAvailableColors()
    {
      return availableColors;
    }

    public static KeyValuePair<Color, string> GetRandomColor()
    {
      return availableColors.ElementAt(rnd.Next(0, availableColors.Count));
    }
  }

Я хочу, чтобы данные связывали Color ComboBox с цветом выбранного автомобиля в ListView. Мой текущий код XAML не работает:

      <ComboBox Grid.Row="1" Grid.Column="1" Margin="2"
            ItemsSource="{Binding Source={StaticResource AvailableColors}}"
            SelectedValuePath="Key"
            DisplayMemberPath="Value"
            SelectedValue="{Binding ElementName=listView, Path=SelectedValue}"/>

Как я могу привязать данные к Color ComboBox, чтобы он представлял цвет выбранного автомобиля, но беря его диапазон значений из статического словаря CarColors?

1 Ответ

0 голосов
/ 02 июля 2018

Если ваш цвет автомобиля - KeyValuePair, попробуйте следующее:

<ComboBox Grid.Row="1" Grid.Column="1" Margin="2"
        ItemsSource="{Binding AvailableColors}"
        SelectedItem="{Binding ElementName=listView, Path=SelectedItem.Color}"
        DisplayMemberPath="Value"/>

NB. Свойство color любого автомобильного объекта должно указывать на элемент списка цветов SourceColors. то есть.

 new Car { Name = "Ford", Speed = 180f, Color = AvailableColors.ElementAt(1)},
...