2013-12-17 4 views
1

Я только начинаю с WPF MVVM & Я пытаюсь заполнить представление datagrid, привязав к ObservableCollection в моей модели.Заполнение коллекции Observable из результатов запроса LINQ

Я использовал простой запрос LINQ, чтобы выбрать все из моей таблицы и заполнить мою наблюдаемую коллекцию, но мой пользовательский интерфейс не отобразит результаты сетки, по-видимому, потому, что XAML должен привязываться к общедоступному свойству?

private void getTableResults() 
{ 
    var query = from c in LDB.myTable 
       select c; 
    var results = query; 

    ObservableCollection<myTable> MyCollection = new ObservableCollection<myTable>(results); 
    OnPropertyChanged("MyCollection"); 
} 

Вот мой XAML привязки:

<DataGrid ItemsSource="{Binding MyCollection}" 

Мой DataContext установлен, и я проверил это связывается с другом жестко закодированы собственности. Где я иду не так? Я поставил контрольную точку над коллекцией, поэтому знаю, что она заполняется результатами. Как я могу открыть публичное свойство ObservableCollection, которое заполнено из моих результатов LINQ?

Благодаря

Просто добавить, моя модель данных MyTable, которая является 4,0 EDMX Entity Framework.

+0

Позвольте мне угадать. В результате вы получаете IEnumerable <>? – Marco

+2

'MyCollection' должно быть публичным, а не локальной переменной. Пожалуйста, ознакомьтесь с основами [привязки данных в WPF] (http://msdn.microsoft.com/en-us/library/ms752347.aspx). – Clemens

ответ

4

Предполагая, что контекст данных вашего представления является вашей моделью просмотра, тогда да - ваше привязку xaml должно быть общедоступным свойством вашей модели. Итак, объявите свойство MyCollection как свойство viewmodel (а не локальное свойство вашего метода getTbaleResults).

private ObservableCollection<myTable> _myCollection; 
/// <summary> 
/// Gets or sets the myTable collection. 
/// </summary> 
public ObservableCollection<myTable> MyCollection 
{ 
    get { return _myCollection; } 
    set 
    { 
     if (value == _myCollection) return; 
     _myCollection= value; 
     RaisePropertyChanged(() => MyCollection); 
    } 
} 

(Обратите внимание, это используется призма так лямбда на RaisePropertyChanged, но и другие структуры имеют подобные реализации).

+0

Хорошо, я понимаю это, когда вы публикуете публичную функцию Observable Collection, но затем как я могу заполнить коллекцию из запроса LINQ? – Hardgraf

+0

@ Хардграф Очень просто. Назначьте 'MyCollection = ...' так же, как и раньше, но * без * объявления его как локальной переменной. И удалите вызов OnPropertyChanged, который теперь находится в настройщике свойств. – Clemens

+0

Да, я пытался это сделать. MyCollection = результаты; но компилятор не может «Implicitly конвертировать Iqueryable в ObservableCollection ... – Hardgraf

Смежные вопросы