プログラムでComboBoxSelectedItemをWPF(3.5sp1)に設定します

2010年02月10日に質問されました。  ·  閲覧回数 41.1k回  ·  ソース

Victor  picture
2010年02月10日

Net Framework 3.5sp1がインストールされているwpfアプリケーションでSelectedItemをプログラムで設定しているときに混乱しました。 私は約100の投稿\ topicsを注意深く読みましたが、それでも混乱しています((My xaml:

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

アイテムの1つに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は読み取り専用プロパティではないのに、なぜ機能しないのですか? それは私の問題ではなく、マイクロソフトの問題だと思います。 または私は何かを逃しましたか? ListBoxで遊んでみましたが、すべて同じコードで問題なく動作し、選択範囲を設定したり、選択範囲を取得したりできます。ComboBoxで何ができるでしょうか。 多分いくつかのトリック???

回答

Sooraj Kitchilu picture
2012年06月30日
12

ComboBox内の任意のアイテムを選択し、それをデフォルトのアイテムとして設定するには、次の行を使用します。

combobox.SelectedIndex = 0; //index should be the index of item which you want to be selected
littlekujo picture
2010年11月17日
7

プログラムでコンボボックスとアイテムを追加すると、これでうまくいきます。

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プロパティを設定してから、テキストを選択した値に設定した場合にも機能します。

ihatemash picture
2010年11月17日
6

ビューモデルにテーマリスト用と選択したアイテム用のパブリックプロパティを作成します。

    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";

または、現在使用しているコードを使用する場合は、選択したアイテムを独自のコードで選択するアイテムの文字列値に設定してみてください。機能するかどうかはわかりませんが、試すことができます。

vapcguy picture
2016年11月08日
2

設定するアイテムのインデックスがわかっている場合、この場合はインデックス1を設定しようとしているように見えますが、次のようにします。

cbTheme.SelectedIndex = 1;

インデックスがわからないときは、本当の問題があることがわかりました。 これは元の質問を超えていることは知っていますが、ドロップダウンにItemSource入力している場合、インデックスがわからないが表示したい値がわかっているときにアイテムを設定する方法を知りたいというその数のGoogle社員にとってはたとえば、 DataTable ItemSourceから

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;ます。

DataRow行の代わりにComboBoxItemアイテムを同様に繰り返すと、OPが示す方法でComboBoxが満たされている場合、同様の結果が得られる可能性があります。

JTew picture
2010年02月10日
0

ComboBoxデータはバインドされていますか?

もしそうなら、おそらくコードよりもバインディングを介してそれを行う方が良いでしょう...。

この質問を参照してください... WPFListViewプログラムでアイテムを選択

たぶん、新しいSelectableObjectを作成します{Text = "Abc Theme"、IsCurrentlySelected = True} SelectableObjectsのコレクションをComboBoxにバインドします。

基本的に、モデルにIsCurrentlySelectedプロパティを設定し、モデルからUIを更新します。

user1063423 picture
2012年04月12日
0

回答4によると

アイテムソースにアイテムをすでに追加している場合。 selectet値のPropertyChangedEventを起動します。

tmpList.Add("Sunrise theme"); 
    tmpList.Add("Sunset theme");
    PropertyChangedEvent.Notify(this,"SelectedItem");