2015-05-08 34 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