2011-08-01 4 views
3

MVVM 응용 프로그램에 데이터 격자가 있습니다. 클라이언트가 데이터를 표시하는 방식 때문에 템플릿 열을 사용해야합니다. 그들은 몇 가지 전형적인 데이터 입력 기능을 원합니다. (데이터 입력을 수행하고 데이터를 확인하고 유효한 경우 행을 커밋하며 다음 행의 첫 번째 텍스트 상자에 초점을 맞추고 탭을 누르면 다음 텍스트 상자를 초점을 맞 춥니 다. 또한 외부 소스에서 그리드로 데이터를 가져 오는 경우가 많습니다. 일반적으로 한 번에 수천 개의 레코드가 있습니다.MVVM WPF DataGrid 데이터 입력 문제

지금 당장은 새로운 행을 추가 한 후 포커스를 설정하는 데 사용하는 각 텍스트 상자에 Loaded 이벤트를 연결했습니다. 내 문제는 많은 행을 가져올 때 눈금 선이 엉망이된다는 것입니다. 사용자가 스크롤하면 Loaded 이벤트가 발생하고 그리드는 기본적으로 사용할 수 없게됩니다. 이 문제를 방지하기 위해 가상화를 사용하지 않도록 설정하고 특정 구성에서 RAM을 많이 차지하는 그리드를 찾았습니다. 이는 받아 들일 수없는 것입니다. 방대한 양의 메모리를 사용하지 않고도 이러한 그리드를 원하는 방식으로 작동시킬 수있는 방법을 찾아 낼 수 없습니다. 마치 새로 추가 된 행에 텍스트 상자를 집중시킬 필요가있는 것처럼 보이지만 데이터 유효성 검사가 viewmodel에서 수행되므로 코드 비하인드에서 새 행에 액세스 할 수 없으므로 "newtextbox.focus()"또는 무엇이든 호출하십시오. 나는 여기에서 꽤 절박하게되고있다, 어떤 제안이라도 크게 감사 할 것이다.

+1

초점 WPF에서 파티 변기의 종류에 갈 것입니다 당신의 XAML

<Grid KeyUp="myDataGrid_KeyUp" > 

이 될 것입니다. Josh Smith가 작성한이 게시물을 확인하십시오. http://joshsmithonwpf.wordpress.com/2010/03/16/control-input-focus-from-viewmodel-objects/ 아마도 해결책에 대한 힌트가 있습니다. – Matthieu

+0

그리드에서 편집/유효성 검사를 건너 뛰고 표시 용 그리드를 사용하는 솔루션은 어떨까요? 그런 다음 그리드 - 행이 말하면 더블 클릭하면 그리드의 행을 편집하는 그리드 - 행 - 편집기가 팝업됩니다. – hkon

+0

분명히 날지 않을 것입니다 ... 클라이언트는 그리드 내에서 직접 데이터 입력을 원합니다. 나는 노력했다. – drowned

답변

2

newtextbox.focus() (및 원하는 다른 작업)를 호출 할 수있는 코드 리스너에 이벤트 리스너를 넣습니다. 뷰 모델의 유효성 검사에서 그리드에서 수행 할 작업을 나타내는 args로 이벤트를 발생 시키십시오.

편집 : OK, 새로운 접근 방식. 키 입력을 트래핑하고 입력 또는 탭에서 원하는 작업을 수행하십시오.

은 코드 숨김

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) 
     } 
    } 
+0

흥미로운 일이지만 정적 이벤트를 사용하지 않고 코드 숨김에서 처리 할 수있는 이벤트를 뷰 모델에서 실행하는 방법은 무엇입니까? – drowned

+0

이 화면에 대한 MVVM 접근 방식을 포기하고 결국 코드 비하인드에서이 대답을 사용했습니다. 이 말도 안되는 아키텍처로 "MVVM"이라고 말하면서 더 이상 싸울 시간이 없습니다. 핵심 이벤트를 트래핑하면 완벽하게 작동합니다. – drowned

+0

좋습니다! 다행이 당신을 위해 일 했어. 나는 또한 대부분 MVVM을 가지고 있지만 때로는 작동하는 것을해야만 다음 문제를 해결할 수 있습니다. –