使用MVVM从List生成DataGrid

时间:2015-12-29 13:20:51

标签: c# wpf mvvm datagrid

我正在尝试根据对象列表的项目创建数据网格。

我有以下课程:

class BookCopies
{
    private string bookTitle;

    private int bookNumbers;

    public string BookTitle
    {
        get;

        set;
    }

    public int BookNumbers
    {
        get;

        set;
    }
}

然后我用这种类型的项目填充经典列表

List<BookCopies> booksWithCopies = new List<BookCopies>();

//...

return booksWithCopies;

基本上这个列表将包含诸如(&#34;汤姆索亚历险记&#34;,3),(&#34;无限玩笑&#34;,8)之类的项目......它保留了一本书标题和书店的书籍数量。

我知道必须将此列表转换为ObservableCollection并引发NotifyPropertyChanged才能获得mvvm模式。

现在我正在尝试的是使用此书列表来设置网格视图的内容。因此,书名成为列标题,并在其下方拥有书籍数量。基本上网格看起来像这样:

Grid layout

大多数硬编码列标题的示例,现在我尝试从列表中读取它,并且还从同一列表中绑定网格的内容。

我对WPF和MVVM都很陌生,首先我想是否有可能(因为我已经在列表中已经拥有了所有数据,这将是很好的)如果可以的话给我一些例子,或者告诉我一些关于如何实现这个的例子。

2 个答案:

答案 0 :(得分:0)

您无法实现您的目标,因为DataGrid不会以这种方式工作。 DataGrid(itemsource)上的有界集合用于填充DataGrid的行。

然而,还有其他人试图做同样的事情。看一下WPF horizontal DataGrid,结果与你描述的类似(左边的列名除外)。由此产生的解决方案需要一些编码。

您可以查看的另一个资源是Code Project网站的Displaying vertical rows in a DataGrid

答案 1 :(得分:0)

<DataGrid x:Name="Dgrd" HeadersVisibility="Row" VerticalGridLinesBrush="LawnGreen" CanUserAddRows="False">
    <DataGrid.Resources>
        <Style TargetType="DataGridRowHeader">
            <Setter Property="BorderBrush" Value="DarkViolet"/>
            <Setter Property="BorderThickness" Value="1"/>
        </Style>
        <Style TargetType="DataGridCellsPresenter">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="DataGridCellsPresenter">
                        <StackPanel>
                                <Label Padding="5" Content="{Binding BookTitle}" BorderThickness="0 0 0 1" FontWeight="Bold" BorderBrush="DarkViolet" Background="Transparent"/>
                                <TextBlock Padding="5" Text="{Binding BookNumbers}"/>
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.Resources>
    <DataGrid.ItemsPanel>
        <ItemsPanelTemplate>
            <DataGridRowsPresenter  Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </DataGrid.ItemsPanel>
</DataGrid>

Output for horizontal grid