如何通过Silverlight以编程方式设置ComboBox的SelectedItem?

时间:2010-03-10 06:26:31

标签: c# wcf silverlight combobox

这是我的方案 - 我正在使用SL3(和WCF数据服务),我有一个管理员工的自定义表单。在表单上,​​我有一些简单的TextBox和一些ComboBox用于输入Employee的基本信息。在我的架构中,我有一些基类,一个用于处理对象集合(实现ObservableCollection和INotifyPropertyChanged),另一个用于实体(捕获和调用OnPropertyChanged(“prop”)。在我的代码后面文件(.cs) ,我有一个处理ComboBox的_SelectedItemChanged()的事件处理程序,例如,EmployeeType,在数据库中,值可能类似于Code列的Director,Staff,Reporter,Manager等(其他列)存在于EmployeeType表中,如Description,ModifiedDate和ID)。我的表单控件上有一些构造函数,当我使用空构造函数加载表单时,没有任何内容被加载(这是它应该加载和纠正的方式),一切都运行得很好,即我可以输入FirstName(TextBox),HireData(TextBox)和EmployeeType(ComboBox)等数据。我遇到的问题是什么时候,我正在加载这个表单,我之前知道EmployeeType,所以我不知道如何设置ComboBox的Se lectedItem以编程方式?

我试过这样的事情,说我希望表单将EmployeeType加载为Manager,所以我有我的Load()方法:

private SetEmployeeType()
{
     var employeeType = new EmployeeType { Code = "Manager" };
     this.EmployeeTypeComboBox.SelectedItem = employeeType;
}

但是当我正在浏览我的代码(F5)时,我看到employeeType为EmployeeType,但是它的属性没有完全填充(除了Code之外所有空白,我明确地称之为“Manager”),所以当我的_SelectedItemChanged( )事件被调用,.SelectedItem = null,因此ComboBox加载时没有选择任何东西(ItemSource被绑定到一个列表,它确实正确通过)。

仅供参考,我有其他方法可以加载我的EmployeeTypes列表,例如GetEmployeeTypes()并且加载正常。如果ComboBox为空,然后我选择一个值,则将正确的值提交给数据库,但正如我所指出的,有时我想预先定义SelectedItem,从而禁止ComboBox禁止用户输入无效数据。

我甚至尝试了一些像这样的LINQ,似乎不起作用:

var type = from e in employeeTypeList // collection loads fine with 10 items
     where e.Code = "Manager"
     select e;

当我追踪上面的查询时,'type'确实返回了正确的EntityType对象,其中填充了所有属性(count = 1,这是正确的),但它似乎没有绑定到ComboBox ComboBox的SelectedItemChanged()期待这样的事情:

var employeeType = this.EmployeeType.SelectedItem as EmployeeType; // i.e. expecting EmployeeType

但是,我的LINQ查询会返回类似以下内容的值:

IEnumerable<EmployeeType> // with some extra stuff...

PS。我正在记忆中工作,因为我现在在家,这是我工作中的代码,所以如果我遗漏了一些明显的东西,请原谅。我尝试过不同的场景,似乎无法弄明白。提前感谢您的任何帮助!

2 个答案:

答案 0 :(得分:2)

听起来您想将所选项目设置为经理。

如果是这样,你想要这样的东西:

var type = (from e in employeeTypeList
    where e.Code = "Manager" 
    select e).FirstOrDefault();
EmployeeType.SelectedItem = type;

您的代码正在创建一个管理器列表,即使它只有一个项目,也与SelectedItem期望的数据类型不匹配。对此的解决方案是使用FirstOrDefault从列表中提取一个项目,这将给出列表中的第一个项目,如果列表为空,则为null。

答案 1 :(得分:0)

如果已设置,请尝试将模式设置为TwoWay而不是Oneway。