Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 列数可变的DataGrid。保持水平滚动条_Wpf_Data Binding_Wpfdatagrid - Fatal编程技术网

Wpf 列数可变的DataGrid。保持水平滚动条

Wpf 列数可变的DataGrid。保持水平滚动条,wpf,data-binding,wpfdatagrid,Wpf,Data Binding,Wpfdatagrid,我需要一个在运行时确定列数的DataGrid。我发现这篇文章: 这说明了如何设置具有可变列数的DataGrid,除了一个小问题外,它工作得非常好。。。当有许多列数据时,水平滚动条不会出现并工作。我猜这与我们没有绑定到许多属性,而只有一个集合保存所有列的信息这一事实有关。如何在网格上甚至网格周围的容器上获得水平滚动条 这是一个遗憾,因为解决方案(从上面的文章)似乎真的很滑。注意巧妙地使用“列表列表”来保持与每个学生相关的分数。还请注意,在学生班级中,每一个分数都有一个属性,这将是多么痛苦!当然,

我需要一个在运行时确定列数的DataGrid。我发现这篇文章:

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

这是一个遗憾,因为解决方案(从上面的文章)似乎真的很滑。注意巧妙地使用“列表列表”来保持与每个学生相关的分数。还请注意,在学生班级中,每一个分数都有一个属性,这将是多么痛苦!当然,如果您可以滚动并查看网格中的所有数据,这将更加流畅

我试了很多东西都没用。我非常感谢你的帮助。我已经把代码贴在下面了

-戴夫

编辑:如果有更好(甚至不同)的方式来显示DataGrid中的可变列数,请给我指出一些参考资料! XAML

{ /// ///Window1.xaml的交互逻辑 /// 公共部分类Window1:Window { 公共窗口1() { 初始化组件(); } }

公共班级学生
{
公共字符串StudentName{get;set;}
公共int StudentId{get;set;}
公开列表项目分数
{
得到
{
列表=新列表();
对于(int i=0;i<100;i++)
{
增加(2000+i);
}
退货清单;
}
}
}
公共类学生视图模型:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私人可观察收集(学生名单);;
公众可观察的集合学生名单
{
得到
{
返回学生名单;
}
设置
{
如果(_studentList!=值)
{
_学生名单=价值;
OnPropertyChanged(“学生名单”);
}
}
}
私人列表(标题列表),;
公共列表标题列表
{
得到
{
返回标题列表;
}
设置
{
如果(_titleList!=值)
{
_标题列表=值;
不动产变更(“标题列表”);
}
}
}
公共学生视图模型()
{
普及学生();
}
私有void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
公共无效的PopulateStudents()
{
var itemList=新的ObservableCollection();
对于(int i=0;i<100;i++)
{
Add(new Student(){StudentName=“一个非常非常长的学生名:“+i}”);
}
StudentList=itemList;
var itemNameList=新列表();
对于(int i=0;i<100;i++)
{
添加(“标题+”+i);
}
标题列表=项目名称列表;
}
} 

}

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

这样做将在DataGrid的底部显示滚动条。
如果不向布局添加其他控件,则可能不再需要StackPanel和ScrollViewer。

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

这样做将在DataGrid的底部显示滚动条。
如果不向布局添加其他控件,则可能不再需要StackPanel和ScrollViewer。

谢谢!那把它修好了达维塔克斯!那把它修好了戴夫
<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>
namespace WpfApplication2
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;
    }

}