我创建了用户控件,其datacontext是从另一个用户控件设置的。当我在主网格中插入此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">
和相关的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一起使用?
答案 0 :(得分:1)
删除DataTemplate中UserControl的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);
}
}