現在這個版本(芒果)的window phone sdk中,如果頁面上放置一個TextBox,點擊ApplicatonBarIconButton後,TextBox的焦點並不會失去,這個不知道算不算是一個Bug,但是確實給開發帶來了一些不便,特別涉及到twoway綁定的時候。
WP的TextBox的Text綁定屬性UpdateSourceTrigger只有兩個值:Default和Explicit,默認當然是Default了,這個Default代表的就是當TextBox失去焦點的時候,纔會去改變通過TwoWay方式綁定的ViewModel中的屬性。
WP的這種綁定策略會給一些開發帶來不便。比如一個頁面中一個TextBox通過Twoway的方式綁定到ViewModel的一個屬性上,改變TextBox的值,然後點擊ApplicatonBarIconButton按鈕保存剛纔TextBox的值。預期應該是能夠保存的,但是結果是並沒有保存。主要原因還是點擊ApplicatonBarIconButton後TextBox並沒有失去焦點,所以也就不會去改變ViewModel中的綁定屬性的值。
上面囉嗦的說了一大堆,其實就是主要的問題就在點擊 ApplicatonBarIconButton後TextBox沒有失去焦點。
下面記錄一下幾種解決方法。
1、設置 UpdateSourceTrigger屬性的值爲Explicit,然後給這個TextBox添加TextChanged事件,在TextChanged事件中更新TextBox的值。代碼如下:
private void OnTextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
TextBox textBox = sender as TextBox;
if (textBox != null)
{
BindingExpression bindingExpr = textBox.GetBindingExpression(TextBox.TextProperty);
if (bindingExpr != null)
{
bindingExpr.UpdateSource();
}
}
}
這種方案,大家一看就明白了,就是隻要TextBox中文字改變就更新綁定,這個可以解決失去焦點後不能獲得綁定的問題,但是如果你的應用程序不需要TextBox每次改變都要處理的話,這種方法就有點太...
2、這種方法的原理和1一樣,但是處理方式有點區別。那就是在頁面中寫一個方法專門處理TextBox綁定的問題。然後在ApplicatonBarIconButton的Click事件中調用這個方法,這樣可以只執行一次更新。方法代碼如下:
// 處理textbox的焦點問題
{
TextBox textBox = FocusManager.GetFocusedElement() as TextBox;
if (textBox != null)
{
BindingExpression be = textBox.GetBindingExpression(TextBox.TextProperty);
if (be != null)
{
be.UpdateSource();
}
}
}
大家應該發現這個方法中的代碼和上面的差不多,哈哈,就是差不多,原理都是一樣的,就是處理的位置不一樣而已。
然後在 ApplicatonBarIconButton的Click事件中,在需要處理和綁定屬性相關的方法之前調用這個方法就可以了。
其實以上兩個方法,並沒有解決掉點擊 ApplicatonBarIconButton之後TextBox沒有失去焦點的問題,只是通過其他方法在點擊之後能很好的獲得TextBox的值。
(以上方法並非個人原創,本人只是收集整理一下)
如果大家有什麼更好的方法,請不吝賜教,先謝謝了。
轉自:http://www.cnblogs.com/acles/archive/2012/03/29/2422522.html