public static void RenderList <T>(IEnumerable <T> @select)
        {
            var grid = new ConsoleGrid();

            grid.SourceList = new ObservableCollection <object>(@select.Cast <object>());
            grid.RenderGrid();
        }
 public ConsoleGridControler()
 {
     ConsoleGrid = new ConsoleGrid();
     Commands    = new List <IGridControlerCommand>();
 }
        public void Run()
        {
            var changed = true;

            while (!StopDispatcherLoop)
            {
                if (changed)
                {
                    ConsoleGrid.RenderGrid();
                }

                changed = false;

                var input = Console.ReadKey(false);
                var gridControlerCommand = Commands.Where(s => s.HandleKey).FirstOrDefault(s => s.Handle(input.Key.ToString().ToLower()));

                if (gridControlerCommand == null)
                {
                    switch (input.Key)
                    {
                    case ConsoleKey.DownArrow:
                        if (FocusedRowIndex < ConsoleGrid.SourceList.Count)
                        {
                            FocusedRowIndex++;
                            ConsoleGrid.FocusedItem = ConsoleGrid.SourceList[FocusedRowIndex - 1];
                            changed = true;
                        }
                        break;

                    case ConsoleKey.UpArrow:
                        if (FocusedRowIndex > 1)
                        {
                            FocusedRowIndex--;
                            ConsoleGrid.FocusedItem = ConsoleGrid.SourceList[FocusedRowIndex - 1];
                            changed = true;
                        }
                        break;

                    case ConsoleKey.Enter:

                        if (input.Modifiers == ConsoleModifiers.Shift)
                        {
                            var max = ConsoleGrid.SelectedItems.Max(s => ConsoleGrid.SourceList.IndexOf(s));
                            var min = ConsoleGrid.SelectedItems.Min(s => ConsoleGrid.SourceList.IndexOf(s));

                            if (max != -1 || min != -1)
                            {
                                var orderAsc = FocusedRowIndex > max;

                                for (int i = 0; i < ConsoleGrid.SourceList.Count; i++)
                                {
                                    var source = ConsoleGrid.SourceList[i];
                                    if (ConsoleGrid.SelectedItems.Contains(source))
                                    {
                                        continue;
                                    }

                                    if (orderAsc)
                                    {
                                        if (i >= max && i < FocusedRowIndex)
                                        {
                                            ConsoleGrid.SelectedItems.Add(source);
                                        }
                                    }
                                    else
                                    {
                                        if (i >= FocusedRowIndex - 1 && i <= min)
                                        {
                                            ConsoleGrid.SelectedItems.Add(source);
                                        }
                                    }
                                }
                                changed = true;
                                break;
                            }
                        }

                        if (input.Modifiers != ConsoleModifiers.Control)
                        {
                            ConsoleGrid.SelectedItems.Clear();
                        }
                        var val = ConsoleGrid.SourceList[FocusedRowIndex - 1];

                        if (ConsoleGrid.SelectedItems.Contains(val))
                        {
                            ConsoleGrid.SelectedItems.Remove(val);
                        }
                        else
                        {
                            ConsoleGrid.SelectedItems.Add(val);
                        }

                        changed = true;
                        break;

                    case ConsoleKey.Delete:
                        if (ConsoleGrid.SourceList.Any())
                        {
                            ConsoleGrid.SourceList.Remove(ConsoleGrid.SourceList[FocusedRowIndex - 1]);
                            if (FocusedRowIndex > 1)
                            {
                                FocusedRowIndex--;
                                ConsoleGrid.FocusedItem = ConsoleGrid.SourceList[FocusedRowIndex - 1];
                            }
                            else if (FocusedRowIndex < ConsoleGrid.SourceList.Count)
                            {
                                FocusedRowIndex++;
                                ConsoleGrid.FocusedItem = ConsoleGrid.SourceList[FocusedRowIndex - 1];
                            }
                        }
                        changed = true;
                        break;

                    default:
                        var fullInput = input.Key + Console.ReadLine();
                        changed = Commands.Where(s => s.HandleString).FirstOrDefault(s => s.Handle(input.Key.ToString())) != null;
                        break;
                    }
                }
                else
                {
                    changed = true;
                }
            }
        }