datatemplate中的usercontrol与" main"之间的区别格

时间:2017-02-04 20:50:51

标签: c# wpf user-controls datatemplate

我创建了用户控件,其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一起使用?

1 个答案:

答案 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);
    }
}