2017-02-04 13 views
0

我创建了用户控件,其数据上下文是从另一个用户控件设置的。当我在主网格中插入这个usercontrol时,它工作正常。datatemplate中的usercontrol和“主”网格之间的区别

<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,例如通过在DbSet上调用Load,然后绑定到本地数据。

ShowListView控制包含此

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

和相关视图模型

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

在DataTemplate中删除用户控件的DataContext的属性:

<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(通过具有IEnumarable参数的构造函数)。 – Crooker

+0

如果您只是使用构造函数来创建新的ObservableCollection而不是使用ToObservableCollection方法,该怎么办? – mm8

+0

我有这种方法,因为我没有注意到这个构造函数,并且该方法与foreach。我直接尝试了它(如更新的mainpost中所见),结果相同。 – Crooker