数据网格WPF中的动态列标头和标头计数

本文关键字:动态 网格 数据网 WPF 数据 | 更新日期: 2023-09-27 17:54:55

我正在我的WPF应用程序中构建一个数据网格。Datagrid的ItemSource被绑定到一个IEnumerable集合。我不知道我的项目的ViewModel。当我将我的datagrid itemsource绑定到datagrid时,我可以动态地获得列标头和行值。

我不知道标题。它可能是任何东西。我需要在网格中显示数据网格中所选行的详细信息。

要做到这一点,我需要被SelectedItem。HeaderName添加到网格的文本块。但这里的问题是我不知道标题的名称。所以我不能简单地硬编码SelectedItem.Headername

和列数可以分别不同。因此,我的详细视图也应该动态编号标题名称与其各自的值,当我的数据网格的一行被选中。

到目前为止,我已经在我的xaml中硬编码并看到了如下所示的结果。因为对于特定文件,我知道它们各自的列标头
<Label HorizontalAlignment="Stretch"
       VerticalAlignment="Center"
       Grid.Row="0"
       Grid.Column="0">Header2:
</Label>
<TextBlock Grid.Row="0"
           Grid.Column="1"
           Name="Header2"
           Text="{Binding SelectedItem.date,  ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />
<Label Grid.Row="0"
       Grid.Column="2"
       VerticalAlignment="Center">Header3:</Label>
<TextBlock Grid.Row="0"
           Grid.Column="3"
           Name="username"
           Text="{Binding SelectedItem.Header3, ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />
<Label Grid.Row="0"
       Grid.Column="4"
       VerticalAlignment="Center">Header4:</Label>
<TextBlock Grid.Row="0"
           Grid.Column="5"
           Name="level"
           Text="{Binding SelectedItem.header4, ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />
<Label Grid.Row="1"
       Grid.Column="0"
       VerticalAlignment="Center">Header5:</Label>
<TextBlock Grid.Row="1"
           Grid.Column="1"
           Name="logger"
           Text="{Binding SelectedItem.header5, ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />
<Label Grid.Row="1"
       Grid.Column="2"
       VerticalAlignment="Center">Headr6:</Label>
<TextBlock Grid.Row="1"
           Grid.Column="3"
           Name="thread"
           Text="{Binding SelectedItem.header6, ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />

因为我是一个初学者,我不知道怎么做这个。如果你尽力帮助我,我会很高兴的。并建议一些概念,我需要阅读相关的这个动态列生成,计数,分配动态列标题到其他控件在UI。提前感谢!

数据网格WPF中的动态列标头和标头计数

我做了一个小项目包含动态生成的网格(TextBlock + TextBox集合)取决于DataGrid标题和对象属性,使你的集合在DataGrid。希望这就是你想要的。你可以从我的SkyDrive下载

XAML:

 <Grid>
        <StackPanel>
        <StackPanel x:Name="myStackPanel" Orientation="Vertical"></StackPanel>
            <DataGrid x:Name="myDataGrid" ItemsSource="{Binding MySource}" AutoGenerateColumns="True">
        </DataGrid>
        </StackPanel>
    </Grid>

我已经在加载事件处理程序中设置了这个:

 for (int i = 0; i < myDataGrid.Columns.Count; i++)
                    {
                        var childStackPanel = new StackPanel { Orientation = Orientation.Horizontal };
                        var myTextBlock = new TextBlock { Text = myDataGrid.Columns[i].Header + " : " };
                        var myTextBox = new TextBox { Width = 200 };
                        Type myType = typeof(Text);
                        IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());
                        myTextBox.SetBinding(TextBox.TextProperty,
                                              new Binding("SelectedItem." + props[i].Name) { ElementName = "myDataGrid" });
                        childStackPanel.Children.Add(myTextBlock);
                        childStackPanel.Children.Add(myTextBox);
                        myStackPanel.Children.Add(childStackPanel);
                    }

文本类:

public class TranslationText
    {
        private string _translation;
        private bool _isTranslated;
        public string Translation
        {
            get { return _translation; }
            set
            {
                _translation = value;
            }
        }
        public bool IsTranslated
        {
            get { return _isTranslated; }
            set
            {
                _isTranslated = value;
            }
        }
    }