DataGrid中所选行的动态详细视图

时间:2013-01-22 07:39:31

标签: .net wpf datagrid

我需要在DataGrid选中的行中创建详细视图。

我应该如何获取datagrid的标头并将其分配给我的详细视图网格Label。 并且标签附近的Textblock应该包含所选行中标题的值。

我的数据网格中的标题不是静态的。它可能会在运行时更改。 我已将数据网格的itemsource与Ienumerable集合捆绑在一起。

如果你能解决我的问题,请提前致谢。

更新

  <my:DataGrid 
                              Grid.Row="0"
                              x:Name="dataGrid1" 
                              Width="auto" 
                              AutoGenerateColumns="True" CanUserAddRows="True"             Margin="0,0,0,0"
                              MouseRightButtonUp="dataGrid1_MouseRightButtonUp" />

在我的代码中,我绑定了Ienumerable集合。

    this.dataGrid1.ItemsSource = objref.Result;
//Where objref.Result is Ienumerable collection

然后在XAML的详细视图中

                           <Label>Date:</Label>
                            <TextBlockName="data"
                       Text="{Binding SelectedItem.date,  ElementName=dataGrid1}" />
                            <Label>Username:</Label>
                            <TextBlock Name="username" 
                       Text="{Binding SelectedItem.username, ElementName=dataGrid1}"
                      />

只需对列标题进行硬编码即可。它可能会改变。我怎么能处理这个。??

1 个答案:

答案 0 :(得分:0)

列出生成正确标头的每个字段已由网格完成。详细视图通常用于显示不适合一行的图像或其他内容。

无论如何,我会假设你不知道objref的结果类型。因此,您需要使用反射:

  1. 创建一个表示属性名称和属性的对象 值。
  2. 在选定项目更改时获取公共属性。
  3. 将此公共属性列表转换为新类的列表
  4. 使用您的datatemplate将其显示为详细视图。
  5. 表示您要显示的信息的类:

    public class PropertyInformation
    {
        public string Name { get; set; }
    
        public object Value { get; set; }
    }
    

    获取属性列表的转换器:

    public class PropertiesLister :IValueConverter
    {
        private const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public;
    
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value.GetType()
                .GetProperties(Flags)
                .Select(pi => new PropertyInformation
                {
                    Name = pi.Name,
                    Value = pi.GetValue(value, null)
                });
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    XAML中属性信息和转换器的模板:

    <Window.Resources>
        <DataTemplate x:Key="UserDataTemplate">
            <StackPanel Orientation="Horizontal">
                <Label Content="{Binding Name}"/>
                <Label Content="{Binding Value}" />
            </StackPanel>
        </DataTemplate>
    
        <Test_DataGridDetailedView:PropertiesListerConverter x:Key="toListConverter" />
    
    </Window.Resources>
    

    使用转换器的详细视图:

    <DataGrid ItemsSource="{Binding Customers}"
              AutoGenerateColumns="True">
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <ItemsControl
                    x:Name="UserList"
                    ItemTemplate="{StaticResource UserDataTemplate}"
                    ItemsSource="{Binding Converter={StaticResource toListConverter}}"
                    />
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>