Wpf 列数可变的DataGrid。保持水平滚动条
我需要一个在运行时确定列数的DataGrid。我发现这篇文章: 这说明了如何设置具有可变列数的DataGrid,除了一个小问题外,它工作得非常好。。。当有许多列数据时,水平滚动条不会出现并工作。我猜这与我们没有绑定到许多属性,而只有一个集合保存所有列的信息这一事实有关。如何在网格上甚至网格周围的容器上获得水平滚动条 这是一个遗憾,因为解决方案(从上面的文章)似乎真的很滑。注意巧妙地使用“列表列表”来保持与每个学生相关的分数。还请注意,在学生班级中,每一个分数都有一个属性,这将是多么痛苦!当然,如果您可以滚动并查看网格中的所有数据,这将更加流畅 我试了很多东西都没用。我非常感谢你的帮助。我已经把代码贴在下面了 -戴夫 编辑:如果有更好(甚至不同)的方式来显示DataGrid中的可变列数,请给我指出一些参考资料! XAML { /// ///Window1.xaml的交互逻辑 /// 公共部分类Window1:Window { 公共窗口1() { 初始化组件(); } }Wpf 列数可变的DataGrid。保持水平滚动条,wpf,data-binding,wpfdatagrid,Wpf,Data Binding,Wpfdatagrid,我需要一个在运行时确定列数的DataGrid。我发现这篇文章: 这说明了如何设置具有可变列数的DataGrid,除了一个小问题外,它工作得非常好。。。当有许多列数据时,水平滚动条不会出现并工作。我猜这与我们没有绑定到许多属性,而只有一个集合保存所有列的信息这一事实有关。如何在网格上甚至网格周围的容器上获得水平滚动条 这是一个遗憾,因为解决方案(从上面的文章)似乎真的很滑。注意巧妙地使用“列表列表”来保持与每个学生相关的分数。还请注意,在学生班级中,每一个分数都有一个属性,这将是多么痛苦!当然,
公共班级学生
{
公共字符串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;
}
}