Программно установить ComboBox SelectedItem в WPF (3.5sp1) - PullRequest
10 голосов
/ 10 февраля 2010

Я был сбит с толку при программной настройке SelectedItem в приложениях wpf с установленным Net Framework 3.5 sp1. Я внимательно прочитал около ста постов \ тем, но все же растерялся (( Мой xaml:

 <ComboBox name="cbTheme">
    <ComboBoxItem>Sunrise theme</ComboBoxItem>
    <ComboBoxItem>Sunset theme</ComboBoxItem> 
 </ComboBox>

Если я добавлю IsSelected = "True" свойство в один из элементов - этот элемент не будет выбран. ЗАЧЕМ ? И я попробовал другой код и все еще не могу установить выбранный элемент:

cbTheme.SelectedItem=cbTheme.Items.GetItemAt(1); //dosn't work
cbTheme.Text = "Sunrise theme"; //dosn't work
cbTheme.Text = cbTheme.Items.GetItemAt(1).ToString();//dosn't work
cbTheme.SelectedValue = ...//dosn't work
cbTheme.SelectedValuePath = .. //dosn't work
//and even this dosn't work:
ComboBoxItem selcbi = (ComboBoxItem)cbTheme.Items.GetItemAt(1);//or selcbi = new ComboBoxItem
cbTheme.SelectedItem = selcbi;

SelectedItem не является свойством только для чтения, так почему он не работает? Я думаю, что это должны быть проблемы Microsoft, а не мои. Или я что то пропустил ??? Я попытался поиграть с ListBox, и все отлично работают с одним и тем же кодом, я могу устанавливать выборки, получать выборки и так далее ... Так что я могу сделать с ComboBox? Может быть, какие-то хитрости ???

Ответы [ 6 ]

9 голосов
/ 30 июня 2012

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

combobox.SelectedIndex = 0; //index should be the index of item which you want to be selected
7 голосов
/ 17 ноября 2010

Если я добавляю комбинированный список и элементы программно, это работает для меня:

ComboBox newCombo = new ComboBox();

ComboBoxItem newitem = new ComboBoxItem();
newitem.Content = "test 1";
newCombo.Items.Add(newitem);
newitem = new ComboBoxItem();
newitem.Content = "test 2";
newCombo.Items.Add(newitem);
newitem = new ComboBoxItem();
newitem.Content = "test 3";
newCombo.Items.Add(newitem);

newCombo.SelectedItem =  ((ComboBoxItem)newCombo.Items[1]);
newCombo.Text = ((ComboBoxItem)newCombo.Items[1]).Content.ToString();

newStack.Children.Add(newCombo);

Это также работает, если установить свойство ItemSource программно, а затем установить текст на выбранное значение.

5 голосов
/ 17 ноября 2010

Создайте общедоступное свойство в вашей viewmodel для списка тем и одного для выбранного элемента:

    private IEnumerable<string> _themeList;
    public IEnumerable<string> ThemeList
    {
        get { return _themeList; }
        set
        {
            _themeList = value;
            PropertyChangedEvent.Notify(this, "ThemeList");
        }
    }
    private string _selectedItem;
    public string SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            PropertyChangedEvent.Notify(this,"SelectedItem");
        }            
    }

привязайте ваш комбинированный список в xaml к таким свойствам:

    <ComboBox 
        Name="cbTheme" 
        ItemsSource="{Binding ThemeList}"      
        SelectedItem="{Binding SelectedItem}">
    </ComboBox>

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

    var tmpList = new List<string>();
    tmpList.Add("Sunrise theme");
    tmpList.Add("Sunset theme");

    _viewModel.ThemeList = tmpList;
    _viewModel.SelectedItem = "Sunset theme";

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

1 голос
/ 07 ноября 2016

Если вам известен индекс элемента, который вы хотите установить, в этом случае похоже, что вы пытаетесь установить индекс 1, вы просто делаете:

cbTheme.SelectedIndex = 1;

Я обнаружил, что когда вы не знаете индекс, именно тогда у вас возникает реальная проблема. Я знаю, что это выходит за рамки первоначального вопроса, но для тех Google, которые хотят знать, как установить элемент, когда индекс неизвестен, но значение, которое вы хотите отобразить, известно, если вы заполняете свой раскрывающийся список знаком * Например, 1005 * из DataTable, вы можете получить этот индекс, выполнив следующее:

int matchedIndex = 0;
if (dt != null & dt.Rows != null)
{
    if (dt.Rows.Count > 0)
    {
        foreach (DataRow dr in dt.Rows)
        {
            string myRowValue = dr["SOME_COLUMN"] != null ? dr["SOME_COLUMN"].ToString() : String.Empty;
            if (myRowValue == "Value I Want To Set")
                break;
            else
                matchedIndex++;
        }
     }
 }

И тогда вы просто делаете cbTheme.SelectedIndex = matchedIndex;.

Аналогичная итерация ComboBoxItem элементов вместо DataRow строк может дать аналогичный результат, если вместо этого заполнить ComboBox, как показывает OP.

0 голосов
/ 12 апреля 2012

Ответ на вопрос 4

Если вы уже добавили Предметы в источник. Запустите PropertyChangedEvent для выбранного значения.

tmpList.Add("Sunrise theme"); 
    tmpList.Add("Sunset theme");
    PropertyChangedEvent.Notify(this,"SelectedItem");
0 голосов
/ 10 февраля 2010

Связаны ли данные ComboBox?

Если это так, вам, вероятно, лучше сделать это через Binding, а не через код ....

См. Этот вопрос ... WPF ListView программно выбрать элемент

Возможно, создайте новый SelectableObject {Text = "Abc Theme", IsCurrentlySelected = True} Привязать коллекцию SelectableObjects к ComboBox.

По сути, установка свойства IsCurrentlySelected в модели и обновление пользовательского интерфейса из модели.

...