2014-01-10 5 views
1

Мне нужен DataGrid с количеством столбцов, определенных во время выполнения. Я нашел эту статью: http://msmvps.com/blogs/deborahk/archive/2011/01/23/populating-a-datagrid-with-dynamic-columns-in-a-silverlight-application-using-mvvm.aspxDataGrid с переменным числом столбцов. Сохранение горизонтальной полосы прокрутки

Это показывает, как создать DataGrid с переменным числом столбцов, и она работает очень хорошо для одной небольшой проблемой ... Горизонтальная полоса прокрутки не появляется и работы, за исключением, когда есть много столбцы данных. Я предполагаю, что это имеет какое-то отношение к тому факту, что мы не привязаны ко многим функциям, а только к одной коллекции, которая содержит информацию обо всех столбцах. Как я могу получить горизонтальную полосу прокрутки на сетке или даже на контейнере вокруг сетки.

Это позор, потому что решение (из статьи выше) кажется действительно гладким. Обратите внимание на использование «Список списков», чтобы сохранить оценки, связанные с каждым учеником. Также обратите внимание на то, какую боль было бы иметь в студенческом классе свойство для каждого счета! Конечно, было бы даже более гладким, если бы вы могли прокручивать и видеть все данные в сетке!

Я пробовал много вещей безрезультатно. Я бы очень признателен за помощь. Я разместил код ниже.

-Dave

Edit: Если есть лучше (или даже разные) способ показать переменное число столбцов в 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 /// Публичный частичный класс Window1: Окно { 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; 
    } 

} 

}

ответ

3

Вы, возможно, потребуется удалить Width = "*" в DataGridTemplateColumn, поскольку она изменяет значение которого зависит Scrollbar.

Выполнение этого будет отображать полосу прокрутки в нижней части DataGrid. Если вы не добавите другой элемент управления в макет, вам больше не понадобится StackPanel и ScrollViewer.

+0

Спасибо! Это исправило это. - Дэйв – Dave

Смежные вопросы