Пример #1
0
        protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
        {
            var fldchoose = new FieldChooser(new FieldChooserModelView(ModelView.ItemType));

            ModelView.RefreshColumns(fldchoose.FieldChooserModelView.AllFields);
            ItemSourceChanged?.Invoke(oldValue, newValue);
        }
Пример #2
0
        protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
        {
            base.OnItemsSourceChanged(oldValue, newValue);

            //порядок вызова важен нужно сначала центрировать а потом ставить фокус
            if (SelectedItem != null)
            {
                //скорбная песнь, для того что бы вычислить вертикальное смещение
                //что бы отобразить строку по центру используется ViewportHeight
                //но при изменение ItemsSource меняется и ViewportHeight
                //но ViewportHeight будет пересчитан только когда будет обновлен layout
                //контрола (ArrangeOverride)
                //по этому мы говорим планировщику что нужно выполнить Centrify после того как он поделает все дела
                //это приводит к неприятному эффекту "дергания" когда таблица рисуется в одном положении
                //а затем почти мгновенно в другом
                ScrollIntoView(SelectedItem);
                Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {
                    DataGridHelper.Centrify(this);
                }));
            }

            //после обновление ItemsSource все визуальные элементы будут перестроены
            //и потеряют фокус
            //для того что бы восстановить фокус нужно запланировать это после того как новые элементы будут построены
            if (IsKeyboardFocusWithin)
            {
                Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {
                    DataGridHelper.Focus(this);
                }));
            }
            ItemSourceChanged?.Invoke(this, new EventArgs());
        }