2017-02-04 1 views
0

Я создал пользовательский элемент управления, чей datacontext установлен из другого пользовательского элемента управления. Когда я вставляю этот usercontrol в основную сетку, он отлично работает.Разница между usercontrol в datatemplate и в «основной» сетке

<Grid> 
    <local:ShowListView DataContext="{Binding ShowListViewModel}"/> 
</Grid> 

Но когда я ввожу его через DataTemplate, как этот

<UserControl.Resources> 
    <DataTemplate DataType="{x:Type showViewModels:ShowListViewModel}"> 
     <local:ShowListView /> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <ContentControl Content="{Binding CurrentView}"/> 
</Grid> 

Он бросает эту ошибку

Привязка данных непосредственно к магазину запроса (DbSet, DbQuery, DbSqlQuery, DbRawSqlQuery) не поддерживается. Вместо этого запишите DbSet с данными, например, вызвав Load на DbSet, а затем привяжите к локальным данным.

управления ShowListView содержит этот

<ListBox ItemsSource="{Binding Shows}" BorderBrush="Transparent" 
     HorizontalContentAlignment="Stretch"> 

и соответствующий ViewModel

public ObservableCollection<ShowModel> Shows { get; set; } 

public ShowListViewModel() 
{ 
    using (var db = new MSDBContext()) 
    { 
     var shows = (from s in db.Shows select s).ToList(); 

     Shows = new ObservableCollection<ShowModel>(shows); 
    } 
} 

Почему первый метод работает без проблем, но второй один бросает ошибку? Что я должен изменить, что он работает с Datatemplate?

ответ

1

Удалить атрибут DataContext в UserControl в DataTemplate:

<DataTemplate DataType="{x:Type showViewModels:ShowListViewModel}"> 
    <local:ShowListView /> 
</DataTemplate> 

ShowListView автоматически получает объект ShowListViewModel в качестве DataContext, когда шаблон применяется при условии, что вы явно не где-то установить его свойство DataContext ,

Вы должны также выполнить запрос перед заполнением ObservableCollection с результатами. Вы можете сделать это с помощью вызова метода ToList():

public ShowListViewModel() 
{   
    using (var db = new MSDBContext()) 
    { 
     var shows = (from s in db.Shows select s).ToList(); 

     Shows = new ObservableCollection<Show>(shows); 
    } 
} 
+0

Так что я удалил DataContext (я пробовал оба варианта, прежде чем без успеха) и добавил ToList показать переменную. И это все еще бросает мне ошибку. Метод ToObservableCollection' просто принимает IEnumerable и изменяет его на Observable Collection (через contructor с аргументом IEnumarable). – Crooker

+0

Что делать, если вы просто используете конструктор для создания нового ObservableCollection вместо использования метода ToObservableCollection? – mm8

+0

У меня был этот метод, потому что я не заметил этот конструктор, и метод был с foreach. Я попробовал это прямо (как видно из обновленного mainpost) с тем же результатом. – Crooker

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