0

DataGrid当我的Selected中有一行时,我需要创建一个详细视图。

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

我的数据网格中的标题不是静态的。它可能会在运行时发生变化。我已将我的数据网格的 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}"
                      />

只是对列标题进行硬编码。它可能会改变。我该如何处理。?

4

1 回答 1

0

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

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

  1. 创建一个表示属性名称和属性值的对象。
  2. 当 selecteditem 更改时获取公共属性。
  3. 将此公共属性列表转换为新类的列表
  4. 使用您的数据模板将其呈现为详细视图。

代表您要显示的信息的类:

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>
于 2013-01-22T13:14:19.157 回答