Установить выбранный индекс ComboBox ViewModel по умолчанию

Я пытаюсь привязать ComboBox к ViewModel и установить его по умолчанию SelectedIndex на 0 или первый элемент.

Когда я устанавливаю SelectedIndex по умолчанию в ViewModel, он не работает.

Хотя с SelectedItem работает.


XAML

<ComboBox x:Name = "cboExample"
          ItemsSource = "{Binding Example_Items}"
          SelectedIndex = "{Binding Example_SelectedIndex}"
          SelectedItem = "{Binding Example_SelectedItem}"

          HorizontalAlignment = "Left" 
          Margin = "0,0,0,0" 
          VerticalAlignment = "Top" 
          Width = "105" 
          Height = "22"/>

ViewModel

Примечание: я устанавливаю только одно или другое.

public ViewModel()
{
    // ComboBox Defaults

    Example_SelectedIndex = 0; // does not work

    Example_SelectedItem = "item 1"; //works
}

Источник товара

public List<string> _Example_Items = new List<string>()
{
    "item 1",
    "item 2",
    "item 3"
};
public List<string> Example_Items
{
    get { return _Example_Items; }
    set
    {
        _Example_Items = value;
        OnPropertyChanged("Example_Items");
    }
}

Выбранный индекс

Не работает

public int _Example_SelectedIndex { get; set; }

public int Example_SelectedIndex
{
    get { return _Example_SelectedIndex; }
    set
    {
        if (_Example_SelectedIndex == value)
        {
            return;
        }

        _Example_SelectedIndex = value;
        OnPropertyChanged("Example_SelectedIndex");
    }
}

Выбранный элемент

Работает

public string _Example_SelectedItem { get; set; }

public string Example_SelectedItem
{
    get { return _Example_SelectedItem; }
    set
    {
        if (_Example_SelectedItem == value)
        {
            return;
        }

        _Example_SelectedItem = value;
        OnPropertyChanged("Example_SelectedItem");
    }
}

Вы устанавливаете оба свойства (SelectedIndex и SelectedItem) в XAML?

Babbillumpa 18.07.2018 17:38

@Babbillumpa не один, я только что показал для примера.

Matt McManis 18.07.2018 17:42

Вы проверяли наличие ошибок привязки в окне вывода?

Babbillumpa 18.07.2018 17:45

@Babbillumpa Я не вижу ошибок, связанных с этим выпадающим списком.

Matt McManis 18.07.2018 17:49

Вы можете привязать только к свойствам. у первой модели представления есть поля.

Emond Erno 18.07.2018 19:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
438
2

Ответы 2

Вы можете установить Example_SelectedIndex при завершении загрузки данных, то есть Example_Items.

   private _Example_Items;
   public List<string> Example_Items
    {
        get 
        { 
            if (_Example_Items == null)
            {
                loadExampleItems();
            }

            return _Example_Items; 
        }
        set
        {
            _Example_Items = value;
            OnPropertyChanged("Example_Items");
        }
    }

// В случае, если вы получаете Данные с сервера, это будет метод асинхронного ответа.

private void loadExampleItems()
{
     var examples = new List<string>()
                    {
                        "item 1",
                        "item 2",
                        "item 3"
                    };

     Example_Items = examples;
     Example_SelectedIndex = Example_Items.FirstOrDefault();
}

Он не может преобразовать элемент string в индекс int, поэтому я использовал Example_SelectedItem = Example_Items.FirstOrDefault();, и он работает. Но почему он не работает с Example_SelectedIndex = 0, как в моем коде?

Matt McManis 18.07.2018 18:30

SelectedIndex будет меняться в зависимости от элемента selectedItem в коллекции. Если вы установите SelectedItem, он также обновит SelectedIndex. Вы должны использовать SelectedIndex как привязку OneWay, чтобы узнать, что такое индекс.

Suresh 18.07.2018 18:36

Не связывайтесь одновременно с SelectedItem и SelectedIndex. Так или иначе. Для меня это отлично работает:

public class ViewModel
{
    public ViewModel()
    {
        Example_SelectedIndex = 0; //unnecessary since the default value of an int is 0
    }

    private List<string> _Example_Items = new List<string>()
    {
        "item 1",
        "item 2",
        "item 3"
    };
    public List<string> Example_Items
    {
        get { return _Example_Items; }
        set { _Example_Items = value; }
    }

    private int _Example_SelectedIndex;
    public int Example_SelectedIndex
    {
        get { return _Example_SelectedIndex; }
        set
        {
            if (_Example_SelectedIndex == value)
                return;

            _Example_SelectedIndex = value;
        }
    }
}

XAML:

<ComboBox x:Name = "cboExample"
          ItemsSource = "{Binding Example_Items}"
          SelectedIndex = "{Binding Example_SelectedIndex}"
          HorizontalAlignment = "Left" 
          Margin = "0,0,0,0" 
          VerticalAlignment = "Top" 
          Width = "105" 
          Height = "22"/>

Кстати, _Example_SelectedIndex должен быть частным полем, а не публичным. _Example_Items тоже должен быть приватным.

@MattMcManis: Вы пробовали это?

mm8 06.08.2018 15:06

Другие вопросы по теме