Поле со списком IQueryable - PullRequest
       0

Поле со списком IQueryable

0 голосов
/ 07 декабря 2011


Недавно я изменил привязку комбинированного списка с Observable Collection на список a и 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 голосов
/ 07 декабря 2011

Я думаю, вы хотите установить SelectedItem, а не SelectedValue.

Редактировать: Позвольте мне указать на несколько вещей, которые кажутся мне необычными в вашем коде.Я не говорю, что что-то не так, но, возможно, размышления об этом помогут.

  1. Субъект , кажется, служит двум целям в первых двух строках вашего взглядамодель.Сначала я предположил, что это какой-то внешний объект данных, который вы держали в IQueryable.В следующей строке это свойство, которое возвращает IQueryable предметов.Позже я вижу, что в вашем свойстве SelectedSubject вы должны указать, что вы возвращаете.Я удивлен, что вам не нужно участвовать в IQueryable <>.Я думаю, что было бы неплохо использовать другое имя для свойства в сравнении с базовым объектом данных.Также кажется, что это может быть уменьшено до просто автоматического свойства.

    public IQueryable Subjects {get;}

  2. Обычно я вижу уведомление об изменении свойства в установщике свойств.Таким образом, в качестве последней строки SelectedSubject вы можете поднять «SelectedSubject».Затем в IniSelections () вы бы не установили частный _selectedSubject, который вы вызвали бы для установки открытого свойства SelectedSubject.

  3. Проверяете ли вы, что ваш if когда-либо возвращает true?Использование «person» сбивает меня с толку, поскольку соглашение об именах _subject указывает, что поля-члены начинаются со знака подчеркивания. Я бы предположил, что person является локальной переменной, но это не соответствует тому, как она используется в свойстве SelectedSubject.

  4. Я бы переписал этот foreach, используя linq с методом FirstOrDefault () в конце, что-то вроде Subject.Where (r => r.name == person.name) .FirstOrDefault ();Затем проверьте регистр по умолчанию, в противном случае используйте First () и обработайте исключение.

  5. В зависимости от того, как определяется .Equals, возможно, он не вернет true, когда два РАЗЛИЧНЫХ объекта Subjectиметь то же имя.Конечно, я должен предположить, что этот человек имеет тип DataAccess.Subject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...