Я пытаюсь привязать ComboBox к ViewModel и установить его по умолчанию SelectedIndex на 0 или первый элемент.
Когда я устанавливаю SelectedIndex по умолчанию в ViewModel, он не работает.
Хотя с SelectedItem работает.
<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"/>
Примечание: я устанавливаю только одно или другое.
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");
}
}
@Babbillumpa не один, я только что показал для примера.
Вы проверяли наличие ошибок привязки в окне вывода?
@Babbillumpa Я не вижу ошибок, связанных с этим выпадающим списком.
Вы можете привязать только к свойствам. у первой модели представления есть поля.





Вы можете установить 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, как в моем коде?
SelectedIndex будет меняться в зависимости от элемента selectedItem в коллекции. Если вы установите SelectedItem, он также обновит SelectedIndex. Вы должны использовать SelectedIndex как привязку OneWay, чтобы узнать, что такое индекс.
Не связывайтесь одновременно с 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: Вы пробовали это?
Вы устанавливаете оба свойства (SelectedIndex и SelectedItem) в XAML?