2015-05-08 70 views
1

我有一個組合框和xaml中硬編碼的comboboxitems,我嘗試基於字符串值以編程方式設置組合框的值。根據內容將ComBox設置爲ComboBoxItem

XAML:即不使用ComboBoxItems的時候我通常會使用

<ComboBox Name="comboCondition"> 
    <ComboBoxItem>Item 1</ComboBoxItem> 
    <ComboBoxItem>Item 2</ComboBoxItem 
</ComboBox> 

代碼:

comboConditionValue.SelectedItem = "Item 1"; 

當然,當組合框包含ComboBoxItems而不是被綁定到一個列表,這並不工作。我能夠找到正確的值是這樣的:

foreach (var item in comboCondition.Items) 
{ 
    if ((item as ComboBoxItem).Content.ToString() == "Item 1") 
     comboCondition.SelectedItem = item; 
} 

這是設置值的混亂和緩慢的方式,沒有人知道任何更簡單的方法,我可以設置正確的ComboBoxItem無需經過完整列表循環?

回答

1

您使用視圖模型,並結合您的組合框的方式(首選方式)

在背後的視圖代碼:

public myView() 
{ 
this.DataContext = new myViewModel(); 
} 
在myViewModel類

那麼,你有一個屬性所選項目:

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

,然後在你的view.xaml綁定到你的組合框:

<ComboBox Name="comboCondition" SelectedItem="{Binding SelectedItem}"> 
    <ComboBoxItem>Item 1</ComboBoxItem> 
    <ComboBoxItem>Item 2</ComboBoxItem 
</ComboBox> 
+0

'comboCondition.Items.IndexOf(「Item 1」)''null'(是「Item 1」存在於Items集合中。我認爲IndexOf會期望ComboBoxItem類型的對象,而不是字符串。我不得不承認我對ViewModel並不熟悉,並且寧願避免爲了這個小問題而實現一個,但我會做一些閱讀,看看這個實現的優點是什麼。如果你刪除或編輯第二個解決方案,我可以接受你的答案 – Scotty

+0

我剛剛學會了如何在我現有的類上實現'INotifyPropertyChanged',所以我已經以這種方式實現了你的第一個建議......第二個建議不起作用 – Scotty

+0

啊是的,你對第二種選擇是正確的。我沒有完全檢查代碼,忽略了記住所需的對象。我想你可以使用類似於:comboCondition.Items.IndexOf(comboCondition.Items.FirstOrDefault(c => c.Text ==「Item 1」)),其中Text是保存顯示值的屬性。但是我很高興你能夠使用視圖模型,也就是到目前爲止,使用WPF時的首選方法。 – JasonWilczak