我最近改变了一个从Observable Collection到一个和IQueryable列表的组合框绑定,并且目前组合框在选择中正确显示了我想要的内容,但是我似乎无法设置组合框的默认项目,它使用了使用ObservableCollevtion,我的代码如下:
<ComboBox ItemsSource="{Binding Path=Subject}" DisplayMemberPath="name" SelectedValue="{Binding Path=SelectedSubject}" Height="23" HorizontalAlignment="Left" Margin="117,303,0,0" Name="ddSubject" VerticalAlignment="Top" Width="235" />
此代码位于ViewModel中:
IQueryable<Subject> _subject;
public IQueryable<Subject> Subject { get { return _subject; } }
Subject _selectedSubject;
public DataAccess.Subject SelectedSubject
{
get { return _selectedSubject; }
set
{
if (value == _selectedSubject)
return;
_selectedSubject = value;
person.subject = SelectedSubject.name;
}
}
void IniSelections()
{
_subject = _sdc.Subjects;
....
foreach(var r in Subject)
if(r.name.Equals(person.subject))
{
_selectedSubject = r;
break;
}
....
base.OnPropertyChanged("SelectedSubject");
}
在构造函数中调用IniSelection函数 如果有人可以告诉我我做错了什么,或者可能指出我想找出它为什么不起作用的方向,我就在徘徊。
全部谢谢:)
答案 0 :(得分:0)
我认为你想设置SelectedItem而不是SelectedValue。
编辑: 让我指出一些让我感到异常的事情。我并不是说有什么不妥,但也许考虑这些会有所帮助。
主题似乎在视图模型的前两行中有两个用途。起初我假设它是一个你在IQueryable中持有的外部数据对象。在下一行中,它似乎是一个返回IQueryable主题的属性。我稍后会在您的SelectedSubject属性中看到您必须限定您返回的内容。我很惊讶你不必参加IQueryable&lt;&gt;。我认为使用不同的属性名称与底层数据对象是一个好主意。此外,它似乎可以简化为自动属性。
public IQueryable Subjects {get;}
我通常会在属性设置器中看到属性更改通知。因此,作为SelectedSubject的最后一行,您可以提出&#34; SelectedSubject&#34;。然后在IniSelections()中你不设置私有_selectedSubject你将调用公共属性setter SelectedSubject。
您是否检查过您的返回是否真实?你使用&#34; person&#34;让我感到困惑,因为_subject的命名约定表示成员字段以下划线开头我假设person是一个局部变量,但这与它在SelectedSubject属性中的使用方式并不相符。
我会在最后使用带有FirstOrDefault()方法的linq重写这个foreach Subject.Where(r =&gt; r.name == person.name).FirstOrDefault(); 然后检查默认情况,另外明智地使用First()并处理异常。
根据.Equals的定义方式,当两个不同的Subject对象具有相同的名称时,它可能不会返回true。当然,我必须假设这个人的类型是DataAccess.Subject