private void RepopulateChildren(ObservableCollection <ObservableCollection <CellContent> > data) { //Debug.WriteLine("RepopulateChildren called."); bool origRecursiveUpdates = PreventRecursiveUpdates; PreventRecursiveUpdates = true; Children.Clear(); RowDefinitions.Clear(); ColumnDefinitions.Clear(); var contextMenu = ParentWindow.Resources["ColumnContextMenu"] as ContextMenu; //var rect = new Rectangle { Fill = Brushes.Gray }; //Grid.SetColumnSpan(rect, 10000); //Children.Add(rect); if (data.Count < 1) { return; } RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); var columnCounter = 0; foreach (var header in data[0]) { ColumnDefinitions.Add(new ColumnDefinition { }); var columnText = NewTextBox(); columnText.Background = new BrushConverter().ConvertFromString("#777") as Brush; columnText.Tag = new TablePosition { Column = columnCounter, Row = 0 }; columnText.ContextMenu = contextMenu; var binding = new Binding("Text") { Source = header }; columnText.SetBinding(TextBox.TextProperty, binding); Grid.SetColumn(columnText, columnCounter); Children.Add(columnText); columnCounter++; } if (data.Count > 50) { mmApp.Model.Window.ShowStatusProgress("Binding table data..."); } var rowCount = 1; foreach (var row in data.Skip(1)) { RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); columnCounter = 0; foreach (var column in row) { var columnText = NewTextBox(); columnText.Tag = new TablePosition { Column = columnCounter, Row = rowCount }; var binding = new Binding("Text") { Source = column, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, Mode = BindingMode.TwoWay }; columnText.SetBinding(TextBox.TextProperty, binding); //columnText.Text = column.Text; columnText.ContextMenu = contextMenu; Grid.SetColumn(columnText, columnCounter); Grid.SetRow(columnText, rowCount); Children.Add(columnText); columnCounter++; } rowCount++; if (rowCount % 8 == 0) { PreventRecursiveUpdates = false; WindowUtilities.DoEvents(); PreventRecursiveUpdates = true; } } var lastText = Children.OfType <TextBox>().LastOrDefault(); if (lastText != null) { lastText.PreviewKeyDown += (s, e) => { if (e.Key == Key.Tab) { if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) { return; } var newRow = new ObservableCollection <CellContent>(); foreach (var header in TableSource[0]) { newRow.Add(new CellContent(string.Empty)); } var textBox = s as TextBox; var pos = textBox.Tag as TablePosition; TableSource.Add(newRow); SelectColumn(pos.Row + 1, 0); } }; } PreventRecursiveUpdates = origRecursiveUpdates; if (!PreventRecursiveUpdates) { InvalidateVisual(); } }