我需要在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}"
/>
只需对列标题进行硬编码即可。它可能会改变。我怎么能处理这个。??
答案 0 :(得分:0)
列出生成正确标头的每个字段已由网格完成。详细视图通常用于显示不适合一行的图像或其他内容。
无论如何,我会假设你不知道objref的结果类型。因此,您需要使用反射:
表示您要显示的信息的类:
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>