DataGrid具有可变数量的列。保持水平滚动条

时间:2014-01-10 01:29:56

标签: wpf data-binding wpfdatagrid

我需要一个在运行时确定列数的DataGrid。我找到了这篇文章: http://msmvps.com/blogs/deborahk/archive/2011/01/23/populating-a-datagrid-with-dynamic-columns-in-a-silverlight-application-using-mvvm.aspx

这显示了如何设置一个具有可变列数的DataGrid,除了一个小问题外,它工作得非常好......当有许多数据列时,水平滚动条不会出现并起作用。我猜这与我们没有绑定到许多专业但只有一个收集所有列的信息的事实有关。如何在网格上或甚至在网格周围的容器上获得水平滚动条。

这是一种耻辱,因为解决方案(来自上面的文章)似乎非常光滑。注意光滑使用“列表列表”以保持与每个学生相关的分数。还要注意在学生班中每个分数都有一个属性是多么痛苦!当然,如果你可以滚动并查看网格中的所有数据,它会更加光滑!

我尝试过很多事情都无济于事。我真的很感激一些帮助。我已经发布了以下代码。

-Dave

编辑:如果有更好(或甚至不同)的方式在DataGrid中显示可变数量的列,请指向我一些参考! XAML

<Window x:Class="WpfApplication2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
<Grid>
    <ScrollViewer x:Name="PageScrollViewer" 
              >
        <StackPanel x:Name="ContentStackPanel">


            <DataGrid AutoGenerateColumns="False" 
                  ItemsSource="{Binding StudentList}">
                <DataGrid.Columns>
                    <DataGridTextColumn 
                         Binding="{Binding StudentName}"  
                         Header="Name"/>

                    <DataGridTemplateColumn Width="*">
                        <DataGridTemplateColumn.HeaderStyle>
                            <Style 
                      TargetType="DataGridColumnHeader">
                                <Setter 
                          Property="HorizontalContentAlignment" 
                          Value="Stretch" />
                                <Setter 
                          Property="VerticalContentAlignment"  
                          Value="Stretch" />
                                <Setter Property="Margin" 
                                     Value="0" />
                                <Setter Property="ContentTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.TitleList}">

                                                <ItemsControl.ItemsPanel>
                                                    <ItemsPanelTemplate>
                                                        <StackPanel 
                                     Orientation="Horizontal">
                                                        </StackPanel>
                                                    </ItemsPanelTemplate>
                                                </ItemsControl.ItemsPanel>
                                                <ItemsControl.ItemTemplate>
                                                    <DataTemplate>
                                                        <Border  Width="70" >
                                                            <TextBlock Text="{Binding}" 
                                          TextAlignment="Center"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </ItemsControl.ItemTemplate>
                                            </ItemsControl>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridTemplateColumn.HeaderStyle>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ItemsControl  
                            ItemsSource="{Binding ProjectScores}">
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel Orientation="Horizontal"/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <Border Width="70">
                                                <TextBlock Text="{Binding}" 
                                        TextAlignment="Center"/>
                                            </Border>
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>

    </ScrollViewer>
</Grid>

这里是MVVM代码(为简单起见,所有文件都在一个文件中):

namespace WpfApplication2

{     ///     /// Window1.xaml的交互逻辑     ///     public partial class Window1:Window     {         public Window1()         {             的InitializeComponent();         }     }

public class Student
{
    public String StudentName { get; set; }
    public int StudentId { get; set; }

    public List<decimal> ProjectScores
    {
        get
        {
            List<decimal> list = new List<decimal>();
            for (int i = 0; i < 100; i++)
            {
                list.Add(2000 + i);
            }
            return list;
        }
    }
}
public class StudentViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ObservableCollection<Student> _studentList;
    public ObservableCollection<Student> StudentList
    {
        get
        {
            return _studentList;
        }
        set
        {
            if (_studentList != value)
            {
                _studentList = value;
                OnPropertyChanged("StudentList");
            }
        }
    }

    private List<string> _titleList;
    public List<string> TitleList
    {
        get
        {
            return _titleList;
        }
        set
        {
            if (_titleList != value)
            {
                _titleList = value;
                OnPropertyChanged("TitleList");
            }
        }
    }

    public StudentViewModel()
    {
        PopulateStudents();
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public void PopulateStudents()
    {
        var itemList = new ObservableCollection<Student>();
        for (int i = 0; i < 100; i++)
        {
            itemList.Add(new Student() { StudentName = "A very, very, very, very, long student Name: " + i });
        }

        StudentList = itemList;

        var itemNameList = new List<string>();
        for (int i = 0; i < 100; i++)
        {
            itemNameList.Add("Header + " + i);
        }
        TitleList = itemNameList;
    }

} 

}

1 个答案:

答案 0 :(得分:3)

您可能需要在DataGridTemplateColumn中删除Width =“*”,因为它会修改滚动条所依赖的值。

执行此操作将显示DataGrid底部的滚动条。 如果您不将其他控件添加到布局中,则可能不再需要StackPanel和ScrollViewer。