private void OnHrvmIsSelectedChanged(ShortHealthRecordViewModel hrvm) { // simulate IsSynchronizedWithCurrentItem for Extended mode // SelectedHealthRecord points to last IsSelected without unselect prev // select may be by IsSelected (rect), so need to set SelectedHealthRecord if (hrvm.IsSelected) { if (!selectedOrder.Contains(hrvm)) { selectedOrder.Add(hrvm); } else { logger.DebugFormat("selectedOrder contains {0}", hrvm); } using (unselectPrev.Join()) { if (SelectedHealthRecords.Count() > 1) { // dont's notify SelectedChanged to save selection using (doNotNotifySelectedChanged.Join()) { SelectedHealthRecord = hrvm; } } else { SelectedHealthRecord = hrvm; } } //logger.DebugFormat("select {0}", hrvm); } else if (!inRemoveDup) { selectedOrder.Remove(hrvm); //logger.DebugFormat("unselect {0}", hrvm); // Сняли выделение, фокус остался — enter будет открывать этот элемент, а выделен другой. Это ок. // Выбранным становится последний. if (SelectedHealthRecord == hrvm) { using (doNotNotifySelectedChanged.Join()) { SelectedHealthRecord = LastSelected; } } } if (doNotNotifyLastSelectedChanged.CanEnter) { OnPropertyChanged(() => LastSelected); //logger.DebugFormat("selected in order\n{0}", string.Join("\n", selectedOrder)); } }
/// <summary> /// Индекс текущей записи в представлении при переупорядочивании. /// </summary> /// <param name="up">Направление перемещения записей</param> /// <returns></returns> internal int GetCurrentSelectedIndex(bool up) { var viewList = view.Cast <ShortHealthRecordViewModel>().ToList(); var selectedIndexes = SelectedHealthRecords.Select(v => viewList.IndexOf(v)); var allNear = selectedIndexes.OrderBy(x => x).IsSequential(); int current; if (allNear) { current = up ? selectedIndexes.Min() : selectedIndexes.Max(); // ближайшая по направлению перемещения } else { current = viewList.IndexOf(SelectedHealthRecord); // первая запись } return(current); }