Wpf 具有多个项的Datagrid行

Wpf 具有多个项的Datagrid行,wpf,datagrid,itemscontrol,Wpf,Datagrid,Itemscontrol,我有一个项目列表,每个项目都包含一个子项目列表。我试图在一个Xceed datagrid中显示这些,每个项目一行,但是如果有多个子项目,我想将它们添加到同一行的垂直堆栈面板中的相应列中。数据网格应该如下所示(忽略破折号,我使用它们来对齐文本): ----------ID------日期输入------日期输出 第1排——ID1——2012年2月10日——2012年2月11日 第二排——ID2——2012年3月10日——2012年3月11日 ------------------2012年3月11日

我有一个项目列表,每个项目都包含一个子项目列表。我试图在一个Xceed datagrid中显示这些,每个项目一行,但是如果有多个子项目,我想将它们添加到同一行的垂直堆栈面板中的相应列中。数据网格应该如下所示(忽略破折号,我使用它们来对齐文本):

----------ID------日期输入------日期输出
第1排——ID1——2012年2月10日——2012年2月11日

第二排——ID2——2012年3月10日——2012年3月11日

------------------2012年3月11日——2012年3月12日

------------------2012年3月12日—2012年3月13日

第三排——ID3---2012年3月11日——2012年3月12日

当前代码如下所示,它仅显示第一个子项DateIn,而不是垂直堆栈面板中的多个日期

public class Item 
{         

    public string ID { get;set; }
    public IList<SubItem> SubItems { get; private set; }       
}
 public class SubItem
{
 public DateTime DateIn {get;set;}
 public DateTime DateOut {get;set;}   
}

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid"
xmlns:xcdv="clr-namespace:Xceed.Wpf.DataGrid.Views;assembly=Xceed.Wpf.DataGrid"    
DataContext="{Binding ElementName=_this}"
>
<Window.Resources>         
    <xcdg:DataGridCollectionViewSource x:Key ="cvsList" Source="{Binding Items, ElementName=_this}" AutoCreateItemProperties="False">
        <xcdg:DataGridCollectionViewSource.ItemProperties>
        <xcdg:DataGridItemProperty Name="ID" Title="ID" DataType="{x:Type System:String}"/>
      <xcdg:DataGridItemProperty Name="DateIn" Title="Date In" ValuePath="SubItems" DataType="{x:Type System:String}" />
      <xcdg:DataGridItemProperty Name="DateOut" Title="Date Out" ValuePath="SubItems" DataType="{x:Type System:String}" />
    </xcdg:DataGridCollectionViewSource>
</Window.Resources>


    <xcdg:DataGridControl 
        Grid.Row="1" SelectionMode="Single"
        ItemsSource="{Binding Source={StaticResource cvsList}, NotifyOnTargetUpdated=True}" >                       

        <xcdg:DataGridControl.Columns>
           <xcdg:Column FieldName="ID" Title="ID" />
            <xcdg:Column FieldName="DateIn" Title="Date In" Width="150">
                <xcdg:Column.CellContentTemplate>
                    <DataTemplate>
                        <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=xcdg:DataRow},
                                                    Path=DataContext.SubItems}" >
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Label Content="{Binding DateIn, StringFormat=dd/MM/yyyy}"/>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel Orientation="Vertical"/>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                        </ItemsControl>
                    </DataTemplate>
                </xcdg:Column.CellContentTemplate>
            </xcdg:Column>
            <xcdg:Column FieldName="DateOut" Title="Date Out" Width="150">
                <xcdg:Column.CellContentTemplate>
                    <DataTemplate>
                        <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=xcdg:DataRow},
                                                    Path=DataContext.SubItems}" >
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Label Content="{Binding DateOut, StringFormat=dd/MM/yyyy}"/>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel Orientation="Vertical"/>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                        </ItemsControl>
                    </DataTemplate>
                </xcdg:Column.CellContentTemplate>
            </xcdg:Column>
        </xcdg:DataGridControl.Columns>                      
    </xcdg:DataGridControl>
公共类项目
{         
公共字符串ID{get;set;}
公共IList子项{get;private set;}
}
公共类子项
{
public DateTime DateIn{get;set;}
public DateTime DateOut{get;set;}
}

我不熟悉Xceed,但对于普通的WPF datagrid,您可以使用转换器类来获取项目并将其转换为多行文本(如果您确实需要,也可以使用StackPanel)。因此,一个转换器用于DateIn列,另一个用于DateOut:

<DataGrid AutoGenerateColumns="False" x:Name="dataGrid1" IsReadOnly="True" >
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Id}"/>
            <DataGridTextColumn Binding="{Binding ., Converter={StaticResource DateInConverter}, Mode=OneWay}"/>
            <DataGridTextColumn Binding="{Binding ., Converter={StaticResource DateOutConverter}, Mode=OneWay}"/>
        </DataGrid.Columns>
    </DataGrid>

如果您需要了解转换器,请参阅。

我不熟悉Xceed,但熟悉普通的WPF datagrid,您可以使用转换器类来获取项目并将其转换为多行文本(如果确实需要,也可以使用StackPanel)。因此,一个转换器用于DateIn列,另一个用于DateOut:

<DataGrid AutoGenerateColumns="False" x:Name="dataGrid1" IsReadOnly="True" >
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Id}"/>
            <DataGridTextColumn Binding="{Binding ., Converter={StaticResource DateInConverter}, Mode=OneWay}"/>
            <DataGridTextColumn Binding="{Binding ., Converter={StaticResource DateOutConverter}, Mode=OneWay}"/>
        </DataGrid.Columns>
    </DataGrid>

如果您需要了解转换器,请参阅。

谢谢您的回答。要求现在已经更改,所以我不需要使用它,但我会将其标记为答案谢谢您的回答。需求现在已经更改,所以我不需要使用它,但我会将其标记为答案