2010-02-10 210 views
5

我在安裝Net Framework 3.5 sp1的wpf應用程序中設置SelectedItem programmaticaly時感到困惑。我已經仔細閱讀了關於百帖\主題,但仍然困惑(( 我的XAML:以編程方式在WPF中設置組合框SelectedItem(3.5sp1)

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

如果我在一個項目中添加IsSelected =「真」屬性 - 它不到風度套這個項目選擇爲什麼 ,我是在嘗試不同的代碼,仍然不能設置所選項目:

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不是隻讀屬性,那麼爲什麼它wan't工作 我認爲那應該是一個微軟?問題,而不是我的,或者我錯過了一些東西???我已經嘗試過使用ListBox進行鋪設,並且所有工作都可以使用相同的代碼,我可以設置選擇,獲取選項等....因此,我可以使用ComboBox做什麼?也許一些技巧?

+0

嗨@Victor你應該選擇ihatemash的回答 – reggaeguitar

回答

0

ComboBox數據是否被綁定?

如果是的話,你很可能是通過有約束力的,而不是代碼更好地做到這一點....

看到這個問題...... WPF ListView Programmatically Select Item

也許創建一個新的SelectableObject {文本=「ABC主題」, IsCurrentlySelected = True} 將SelectableObjects的集合綁定到ComboBox。

本質上在模型中設置IsCurrentlySelected屬性,並從模型中進行UI更新。

4

如果我添加組合框和項目編程,這個工作對我來說:

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屬性編程,然後將文本設置爲所選值。

4

創建您的視圖模型爲主題列表和一個選定項目的公用屬性:

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> 

現在你do是將項目添加到ThemeList來填充組合框。要選擇列表中的項目,所選擇的屬性設置爲項目的文本,你想選擇這樣的:

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

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

或嘗試選擇的項目設置爲你在自己想要選擇的項目的字符串值如果你想使用你現在使用的代碼的代碼 - 不知道它是否會工作,但你可以嘗試。

+0

確保你設置你的視圖的datacotext爲包含ThemeList和SelectedItem屬性的任何類 - 即你的ViewModel。 – ihatemash

+2

這應該是被接受的答案,它是唯一一個單元測試 – reggaeguitar

0

評論回覆4

如果您已經添加項目來源中的項目。 觸發選擇值的PropertyChangedEvent。

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

要在ComboBox選擇任何項目,將它設置爲默認項選擇只使用下面一行:

combobox.SelectedIndex = 0; //index should be the index of item which you want to be selected 
+0

爲我工作的! –

0

如果你知道你要設置的項目的索引,在此區分它看起來像你想設置索引1,你只需要做:

cbTheme.SelectedIndex = 1; 

我發現,當你不知道的指數,這是當你有真正的問題。我知道這超出了原來的問題,但對於那些希望知道如何設置該項目的Google員工,當索引不知道但想要顯示的值已知時,如果您正在用ItemSource填充下拉菜單從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表演,來代替。

相關問題