Проблема ввода данных таблицы данных MVVM WPF - PullRequest
3 голосов
/ 02 августа 2011

В моем приложении MVVM есть сетка данных, которая из-за способа, которым клиент хочет отображать данные, должна использовать столбцы шаблона. Тем не менее, им нужны некоторые типичные функции ввода данных (нажатие клавиши Enter выполняет проверку данных, фиксирует строку, если она действительна, фокусируется на первом текстовом поле следующей строки; нажатие клавиши tab фокусируется на следующем текстовом поле ...). Кроме того, данные часто импортируются из внешнего источника в сетку, обычно это тысячи записей одновременно.

Сейчас у меня есть событие Loaded, подключенное к каждому текстовому полю, которое я использую, чтобы установить фокус после добавления новых строк. Моя проблема заключается в том, что сетка становится бесполезной, когда я импортирую много строк. Когда пользователь выполняет прокрутку, запускаются загруженные события, и сетка становится практически непригодной для использования. Я отключил виртуализацию, чтобы предотвратить это, и обнаружил, что моя сетка занимает гигабайт ОЗУ в определенных конфигурациях, что недопустимо. Я не могу найти способ заставить эту сетку работать так, как им требуется, без использования огромного количества памяти. Кажется, что мне просто нужно иметь возможность сфокусировать текстовое поле внутри новой добавленной строки, но поскольку проверка данных выполняется в viewmodel, у меня нет доступа к новой строке в codebehind, поэтому я не могу просто вызовите "newtextbox.focus ()" или как угодно. Я становлюсь довольно отчаянным здесь, любые предложения будут высоко оценены.

1 Ответ

2 голосов
/ 02 августа 2011

Поместите прослушиватель событий в код, который может вызывать ваш newtextbox.focus () (и все, что вы хотите сделать). При проверке в модели представления запустите событие с аргументами, указывающими, что вы хотите, чтобы ваша сетка делала.

Редактировать: ОК, новый подход. Попробуйте перехватить нажатие клавиш, и на вводе или на вкладке сделайте то, что вам нужно.

Это будет в вашем xaml

<Grid  KeyUp="myDataGrid_KeyUp" >

Это будет в вашем коде позади

    private void myDataGrid_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            // do your enter stuff here, manipulate the view model for validation, etc.
        }
        else if (e.Key == Key.Tab)
        {
            // do your tab stuff here (get selected row, determine cell focus, focus on next cell)
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...