Пример #1
0
        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();
            }
        }