【问题标题】:My autogenerated columns do not show in Datagrid我的自动生成的列未显示在 Datagrid 中
【发布时间】:2013-12-25 22:37:51
【问题描述】:

大多数关于 DataGrid AutoGenerateColumns 的帖子似乎都在处理如何规避默认行为。不幸的是,默认值是我正在努力解决的问题。

我有几个使用 Entity Framework 6.0 创建的数据库表,并希望在我的视图中显示它们,对所有表使用一个相同的 Datagrid,并自动生成列。期望的结果:对于在运行时绑定的特定于类的 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,其中我可以看到一个灰色的主体(可能是行)被水平和垂直滚动条包围,在其顶部有一条长线(必须是标题行) , 但没有列

感谢任何帮助。

【问题讨论】:

    标签: mvvm wpf-controls wpfdatagrid autogeneratecolumn


    【解决方案1】:

    您的数据网格需要设置其 itemsource

    尝试添加

    ItemsSource="{Binding CurrentDataTable}"

    到数据网格声明。另外,您是否在输出窗口中遇到任何绑定错误?

    【讨论】:

    • 您是否尝试过包含 itemsource 绑定?
    • ItemsControl 包含您建议的 ItemsSource 行,并且 ItemsTemplate 语句应该允许我不在模板中包含 Binding 语句。从 ItemsControl 中删除它并将 Binding 语句放在模板中会从 UI 中完全删除数据网格。
    • 我会将数据网格从数据模板中取出并使其正常工作,然后尝试将其移回。如果没有显示列,则它没有获取记录,这要么是绑定问题或数据检索问题。
    • 谢谢J.King!删除数据模板并直接在网格中创建数据网格从一开始就工作,绝对没有更改代码。既然目标已经实现,这就是我要去做的——我仍然想知道以前的代码哪里出错了。
    【解决方案2】:

    这段代码现在可以工作了(谢谢 J. King!)诀窍是摆脱数据模板,在网格中创建数据网格,并使用完全相同的绑定语句。

        <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多