2014-01-20 150 views
2

我有一個UserControl允許用戶輸入數據。我試圖強制執行,當從用戶控件中刪除焦點時,會發生數據驗證,用戶必須返回並更正數據或取消所做的更改。WPF用戶控件失去焦點

我試過用用戶控件LostFocus,但是這似乎是每當用戶在用戶控件內部的控件之間移動時調用,而不是當用戶控件失去焦點時。此外,看起來沒有辦法看到焦點轉移到哪裏,並防止失去焦點 - 即迫使用戶回去並糾正事情。

我來自Winforms背景,這將很容易實現,但我看不到任何簡單的方法在WPF中執行此操作。

有人可以幫忙嗎?

謝謝

P.S.示例代碼(不起作用...)

private void UserControl_LostFocus(object sender, RoutedEventArgs e) 
    { 
     if (IsModified) 
     { 
      e.Handled = true; 
      btnSave_Click(this, e); 
     } 

    } 

上面的內容在用戶控件內部的控件失去焦點時調用。所以如果用戶控件有3個文本框,當用戶在每個文本框之間移動時,每次都會調用該事件。如果焦點從用戶控件本身移開,我只想處理事件。然後,我想提示用戶沿着「請保存或取消您的更改,然後再離開此頁面」。然後,只有當焦點移動到應用程序的另一部分,而不是,例如,如果用戶有ALT-Tabbed遠離應用程序。

+0

這是*不是*我們必須在WPF中做的事情......或者不是像那樣手動操作。請查看['Binding.UpdateSourceTrigger'屬性](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger(v = vs.110).aspx) MSDN上的頁面。 – Sheridan

+0

按照本網站的慣例,如果您按照[我如何提出一個好問題?](http://stackoverflow.com/help/how-to-ask)上的描述,可能會發現您會得到更多答案。 [幫助中心]頁面(http://stackoverflow.com/help)。請添加一個[簡單的代碼示例](http://stackoverflow.com/help/mcve),它仍然清楚地顯示了您的問題。 – Sheridan

+0

感謝你們,但我已經看過這個領域,它不適合我想要的東西,我對你的評論感到困惑,「這不是我們在WPF中所做的事情」。我想要做的事情並不少見 - 只有在用戶點擊提交後纔會提交數據。這不是問題。問題在於如何防止用戶在提交或取消更改之前離開控制檯。所以,盡我所能,看到這與數據綁定無關,而是UI控制。 –

回答

-1

好的,所以我現在從你的意見中瞭解到,你只是想在用戶保存或取消當前編輯操作之前阻止用戶離開視圖。爲了將來的參考,總是最好從總體目標開始提問......就像上面的句子一樣。 然後你繼續說出你試過的東西......你現在有的問題文本。如果你這樣做了,你的問題將立即得到解答。

那麼我們該如何實現呢?這真的很簡單,但這取決於你改變視圖的方式。當我的應用程序中的用戶更改視圖時,他們點擊Button。那Button有一個相關的Command和視圖模型中的ICommand屬性,我加載相關的視圖。現在,無論您使用Command s還是事件,當用戶想要更改視圖都無關緊要時。

這是在應用程序中有控制權。如果數據項目尚未保存,或者編輯未被取消,則無法加載視圖。我假設,如果它被取消了,那麼你會加載一個不同的視圖,所以你只需要檢查在加載所請求的視圖之前該項目是否已被保存。

如果您選擇,您也可以在此階段設置一個屬性,以在用戶界面中顯示消息,以便用戶在更改視圖之前必須保存或取消消息。這可以簡單地完成,就像數據綁定string那樣在用戶界面中從空開始到TextBlock,並在用戶嘗試加載另一個視圖時將其設置爲消息。

+0

謝謝,但這仍然不能阻止用戶移動到另一個頁面。這意味着他們正在編輯的事實被記錄下來。 –

+0

它不怎麼樣?我說*這是在你的應用程序控制權。如果數據項沒有被保存,或者編輯沒有被取消,您可以簡單地不加載視圖* ...如何加載新視圖*不*防止用戶在您調用時更改視圖或頁面它? – Sheridan