2013-01-22 6 views
0

Я создаю datagrid в своем приложении WPF. ItemSource Datagrid ограничен коллекцией IEnumerable. Я не являюсь ViewModel моего проекта. Когда я привязываю свой источник данных datagrid к datagrid, я получаю заголовки столбцов и значения Row на лету.Динамические заголовки столбцов и количество заголовков в Datagrid WPF

Я не знаю заголовков. Это может быть что угодно. Мне нужно отобразить подробную информацию о выбранной строке в 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" /> 

Поскольку я являюсь новичок я не мог понять, как это сделать. Буду рад, если вы попытаетесь мне помочь. И предложите некоторые концепции, которые мне нужно прочитать, связанные с этой динамической генерацией столбцов, Count, назначение динамических заголовков столбцов другому элементу управления в пользовательском интерфейсе. Спасибо заранее!

+0

Если я вас понимаю хорошо, даже контент Grid, отображающий информацию DataGrid, должен быть динамическим, не так ли? в этом случае лучший способ сделать это - позади кода. – HichemSeeSharp

+0

@HichemC: да, правильно .. :) – BinaryMee

ответ

0

Я создал небольшой проект, содержащий динамическую генерацию сетки (TextBlock + TextBox clollection) в зависимости от заголовков DataGrid и свойств объекта, которые сделали вашу коллекцию в DataGrid. Надеюсь, это то, что вы ищете. Вы можете DONWLOAD его от my SkyDrive

XAML:

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

     </StackPanel> 
    </Grid> 

Я поставил это в Loaded обработчика событий:

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; 
      } 
     } 

    } 
+0

Спасибо u..U решил мою проблему .. :) Еще одно сомнение .. MessageBox.Show (dataGrid1.Columns [i] .Header.ToString() + (новое привязка (" SelectedItem. "+ DataGrid1.Columns [i] .Header.ToString()) {ElementName =" dataGrid1 "})); То есть я показываю заголовок и его выбранное значение в окне сообщений. Я получаю правильный выбранный заголовок. Но я не получаю соответствующее значение. Можете ли вы помочь на этом? – BinaryMee

+0

Если мой ответ разрешает ваш базовый вопрос, тогда вы должны отметить его как ответ. Ваш второй вопрос немного запутан. вам нужно показать «заголовок с соответствующей выбранной ячейкой»? – HichemSeeSharp

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