组合框IQueryable绑定

时间:2011-12-06 22:25:10

标签: c# wpf linq combobox


我最近改变了一个从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函数 如果有人可以告诉我我做错了什么,或者可能指出我想找出它为什么不起作用的方向,我就在徘徊。

全部谢谢:)

1 个答案:

答案 0 :(得分:0)

我认为你想设置SelectedItem而不是SelectedValue。

编辑: 让我指出一些让我感到异常的事情。我并不是说有什么不妥,但也许考虑这些会有所帮助。

  1. 主题似乎在视图模型的前两行中有两个用途。起初我假设它是一个你在IQueryable中持有的外部数据对象。在下一行中,它似乎是一个返回IQueryable主题的属性。我稍后会在您的SelectedSubject属性中看到您必须限定您返回的内容。我很惊讶你不必参加IQueryable&lt;&gt;。我认为使用不同的属性名称与底层数据对象是一个好主意。此外,它似乎可以简化为自动属性。

    public IQueryable Subjects {get;}

  2. 我通常会在属性设置器中看到属性更改通知。因此,作为SelectedSubject的最后一行,您可以提出&#34; SelectedSubject&#34;。然后在IniSelections()中你设置私有_selectedSubject你调用公共属性setter SelectedSubject。

  3. 您是否检查过您的返回是否真实?你使用&#34; person&#34;让我感到困惑,因为_subject的命名约定表示成员字段以下划线开头我假设person是一个局部变量,但这与它在SelectedSubject属性中的使用方式并不相符。

  4. 我会在最后使用带有FirstOrDefault()方法的linq重写这个foreach Subject.Where(r =&gt; r.name == person.name).FirstOrDefault(); 然后检查默认情况,另外明智地使用First()并处理异常。

  5. 根据.Equals的定义方式,当两个不同的Subject对象具有相同的名称时,它可能不会返回true。当然,我必须假设这个人的类型是DataAccess.Subject