Ошибка при привязке WPF Combobox ItemsSource к массиву строк

Я не мог установить ItemsSource выпадающего списка в массив. Я попытался установить DataContext для класса, в котором находится массив, а затем установить привязки в XAML

 class Car
{
    public string[] makes;
}

...

public MainWindow()
{
    Car _Car = new Car();
    _Car.makes = new string[]
        {
            "Toyota",
            "Mitsubishi",
            "Audi",
            "BMW"           
        };

    this.DataContext = _Car;
}

а затем в XAML

<ComboBox Name="cars" Grid.Column="0" 
              Grid.Row="0" Margin="5" 
              ItemsSource="{Binding Path=makes}"/>

Кажется, это ничего не делает. В списке «Мои автомобили» не будет никаких элементов.

Я также пробовал явно назначить

cars.ItemsSource= new string[]{
                "Toyota",
                "Mitsubishi",
                "Audi",
                "BMW"           
            };

Но затем я получаю это сообщение об ошибке:

Исключение было создано целью вызова.

Я что-то пропустил?


person Carl Nathan Mier    schedule 03.12.2013    source источник


Ответы (2)


Привязка WPF не поддерживает поля. Сделайте его свойством с геттером и сеттером

class Car
{
    public string[] makes { get; set; }
}

Тем не менее, вам не нужно явно указывать Path, поэтому этого должно быть достаточно

<ComboBox Name="cars" Grid.Column="0" 
          Grid.Row="0" Margin="5" 
          ItemsSource="{Binding makes}"/>
person Omri Btian    schedule 03.12.2013
comment
Вот это да. это сработало, спасибо! .. но как это могло быть, если для 'make' уже установлено значение 'public', которое, в моем понимании, уже доступно для других функций? - person Carl Nathan Mier; 03.12.2013
comment
@CarlNathanMier Это доступно, но этого недостаточно. Привязка WPF работает с моделью PropertyDescriptor, для которой требуется свойство. вы можете прочитать об этом подробнее здесь - person Omri Btian; 03.12.2013
comment
Спасибо, но знаете ли вы, почему назначается "cars.ItemsSource = new string [] {Toyota, Mitsubishi, Audi, BMW};" возвращает исключение? Благодарность - person Carl Nathan Mier; 03.12.2013
comment
@CarlNathanMier Я предполагаю, что вы могли бы установить ItemsSource дважды, в xaml ItemsSource="{Binding makes}" и в коде программной части, но вы должны изучить внутреннее исключение, чтобы получить более подробную информацию ... - person Omri Btian; 03.12.2013

Чтобы привязка данных работала правильно, вам необходимо «Свойство» для привязки.

XAML

<ComboBox Name="cars" Grid.Column="0" 
          Grid.Row="0" Margin="5" 
          ItemsSource="{Binding makes}"/>

Код

class Car
{
    public string[] makes { get; set; }
}
person Ramashankar    schedule 03.12.2013