2011-08-01 56 views
3

我的MVVM應用程序中有一個datagrid,因爲客戶端希望顯示數據的方式,需要使用模板列。他們想要一些典型的數據輸入功能(按Enter執行數據檢查,如果有效則提交該行,將焦點放在下一行的第一個文本框上;按Tab鍵將焦點放在下一個文本框中...)。另外,數據通常從外部源輸入到網格中,通常每次都有數千條記錄。MVVM WPF datagrid數據錄入問題

現在,我有一個Loaded事件連接到每個文本框,我用它來添加新行後設置焦點。我的問題是,當我導入很多行時,網格會變得不合時宜。當用戶滾動時,加載的事件被觸發,網格變得基本不可用。爲了防止這種情況,我禁用了虛擬化功能,並發現我的網格在某些配置中佔用了一定的RAM空間,這是不可接受的。我無法弄清楚如何在不使用大量內存的情況下按照他們的要求工作。看起來好像我只需要能夠將文本框集中到新添加的行中,但由於數據驗證是在viewmodel中執行的,因此我無法訪問代碼隱藏中的新行,所以我不能調用「newtextbox.focus()」或其他。我在這裏變得非常絕望,任何建議都會受到大力讚賞。

+1

重點是一種在WPF掃興的。檢查這個帖子喬希史密斯http://joshsmithonwpf.wordpress.com/2010/03/16/control-input-focus-from-viewmodel-objects/,也許有一個解決方案的提示。 – Matthieu

+0

如何在網格中跳過編輯/驗證並僅使用網格進行顯示的解決方案如何?然後當一個網格行被說出時,雙擊你彈出一個網格行編輯器,它用作網格中行的編輯。 – hkon

+0

這絕對不會飛......客戶希望直接在網格中輸入數據。我試過了。 – drowned

回答

2

把一個事件監聽器放在後面的代碼中,可以調用你的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) 
     } 
    } 
+0

這聽起來很有趣,但是,如果不使用靜態事件,我怎樣才能在viewmodel中觸發一個可以在代碼隱藏中處理的事件? – drowned

+0

我最終放棄了這個屏幕的MVVM方法,只是純粹在代碼隱藏中使用這個答案。我只是沒有更多時間去與這個荒謬的架構作鬥爭,而只是說它是「MVVM」。誘捕關鍵事件完美無缺,謝謝。 – drowned

+0

太棒了!很高興它對你有效。我也主要是MVVM,但有時候你只需要做一些有效的工作,這樣就可以解決下一個問題。 –