我的自动生成的列不会显示在Datagrid中

时间:2013-12-08 22:40:07

标签: mvvm wpf-controls wpfdatagrid autogeneratecolumn

有关DataGrid AutoGenerateColumns的大多数帖子似乎都涉及如何规避默认行为。不幸的是,默认是我正在努力的。

我有几个使用Entity Framework 6.0创建的数据库表,并希望在我的View中使用同一个Datagrid在所有表中显示它们,以及AutoGenerating列。期望的结果:对于在运行时绑定的特定于类的Viewmodel,显示带有标题和至少一行的列。

View的用户控件的XAML:

<UserControl.Resources>
    <DataTemplate x:Key="TableDataTemplate">
        <DataGrid
            AutoGenerateColumns="True"
            GridLinesVisibility="All"
            HorizontalScrollBarVisibility="Visible"
            VerticalScrollBarVisibility="Visible">
        </DataGrid>
    </DataTemplate>
</UserControl.Resources>

<StackPanel Height="720" Width="980">
    <!-- shows user which menu item was chosen -->
    <TextBlock Text="{Binding DisplayName}"/>

    <!-- defines the Input data grid for adding to DB table -->
    <Grid Height="80" MaxHeight="200">
        <ItemsControl
            ItemsSource="{Binding CurrentDataTable}" 
            ItemTemplate="{StaticResource TableDataTemplate}">
        </ItemsControl>
    </Grid>

用户控件绑定到特定于类的'Class'TableViewModel,为所有数据库表实现。一个例子:

class ClientsAdminTableViewModel : TableViewModel
{
    // the Property the view binds to
    private IList<Client> currentDataTable;

    public ObservableCollection<Client> CurrentDataTable
    {
        get { return CollectionExtensions.ToObservableCollection<Client>(currentDataTable); }
        set { currentDataTable = value; OnPropertyChanged("CurrentDataTable")}
    }

    public ClientsAdminTableViewModel()
    {
        DisplayName = Strings.ClientAdminDisplayName;
        currentDataTable = context.Clients.ToList<Client>();
    }

当绑定到{Binding CurrentDataTable}时,此代码会生成一个UI,我可以在其中看到由水平和垂直滚动条包围的灰体(可能是行),在其上面有一条长行(必须是标题行) ,但没有列

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您的datagrid需要设置其itemsource

尝试添加

ItemsSource =“{Binding CurrentDataTable}”

到datagrid声明。另外,你在输出窗口中得到任何绑定错误吗?

答案 1 :(得分:0)

此代码现在有效(谢谢J.金!)诀窍是摆脱数据模板,使用完全相同的绑定语句在网格中创建数据网格。     

    <StackPanel Height="720" Width="980">
        <!-- shows user which menu item was chosen -->
        <TextBlock Text="{Binding DisplayName}"/>

        <!-- defines the Input data grid for adding to DB table -->
        <Grid Height="200" MaxHeight="400">

            <DataGrid 
                ItemsSource="{Binding CurrentDataTableNew}" 
                AutoGenerateColumns="True"
                GridLinesVisibility="All" 
                HorizontalScrollBarVisibility="Visible" 
                VerticalScrollBarVisibility="Visible" >
            </DataGrid>
        </Grid>
    </userControl>