2013-10-12 95 views
0

我不得不使用第三方控件來屏蔽文本輸入。對於第三方控制的XAML看起來像這樣
<thirdParty:MaskInput Value={Binding Path=Phone, UpdateSourceTrigger=LostFocus} x:Name=Phone LostFocus=Phone_LostFocus />哪個會先觸發WPF控件中的綁定觸發器或事件

現在在我後面的代碼我有這樣的事件處理程序的代碼 -
public void Phone_LostFocus(object sender, RoutedEventArgs e) { ((MaskInput)sender).Value = ((MaskInput)e.OriginalSource).Text; }

當我執行這個代碼有時Value屬性被設置並且有時它不被設置爲文本。

我懷疑綁定的UpdateSourceTrigger。我應該把它改成別的東西嗎? UpdateSourceTrigger和事件本身之間的情況下的順序是什麼?這個訂單是否可預測,即它是否總是按照這個順序發生?

+1

我不知道你想在你的事件處理程序代碼,這樣做,因爲我沒有看到你的MaskInput Text屬性是什麼,但如果你想你的價值屬性被不斷更新,你可以改變UpdateSourceTrigger到的PropertyChanged,而不是LostFocus – Nitin

+0

Nit,我正在做這一切,因爲thirdParty控件有缺陷。我無法放棄控制,仍然需要解決問題。我猜這個控件是從它的heirarchy中的TextBox派生的,因此它具有Value和Text屬性。 –

回答

1

我假設你在調用LostFocus事件時需要進行更改?

您可以在這裏做一些事情,因爲據我所知,在LostFocus的UpdateSourceTrigger和LostFocus事件之間的順序是不可預測的。

1.在不同的時間更新源觸發器。如果您在屬性更改時執行此操作,則在調用LostFocus事件時,您的模型將已更新。缺點是,如果每次更新模型時都要在幕後進行大量處理,則此操作將緩慢進行。

<thirdParty:MaskInput Value={Binding Path=Phone, UpdateSourceTrigger=PropertyChanged} LostFocus=Phone_LostFocus/> 

2.在LostFocus事件中傳播對模型所做的更改,並將綁定保留爲OneWay(從模型到控件)。

<thirdParty:MaskInput Value={Binding Path=Phone, Mode=OneWay}, LostFocus=Phone_LostFocus/> 

public void Phone_LostFocus(object sender, RoutedEventArgs e) { 
    myPhone.Value = ((MaskInput)sender).Text; 
    //rest of event code here. 
} 

3.在LostFocus事件中使用MaskInput值,並且不必擔心模型何時發生更改。

<thirdParty:MaskInput Value={Binding Path=Phone, UpdateSourceTrigger=LostFocus}, LostFocus=Phone_LostFocus/> 

public void Phone_LostFocus(object sender, RoutedEventArgs e) { 
    string currentText = ((MaskInput)sender).Text; 
    //rest of event using currentText; 
}