【Windows 10 應用開發】使用x:Bind標記動態獲得計算結果
UWP 在傳統(WPF)的Binding標記上引入了 Bind 標記,Bind 基於編譯階段生成,因而具有較高的性能。但是,你得註意,這個性能上的優化是免去了運行階段動態綁定的開銷,這是不包括數據源的體積的。要是你的數據源本身很大的話,那是沒辦法優化的,只能靠你自己想辦法,盡可能把加載到內存中的數據縮小,比如你只加載300條,不要一下子就讀幾萬條數據。當然也可以使用增量加載方案。
Bind 標記還有一個特色——可以綁定事件處理方法和常規方法,可以給綁定的方法傳遞參數。比如有這樣一個方法:
int Add ( int x, int y )
你可以這樣綁定:
<obj prop= "{x:Bind Add(2,5)}" ... />
在使用過程中,你還可以進行類型強制轉換。
<obj prop = "{x:Bind ((Button)parm).Content}" .../>
你必須註意的,由於bind標記是在編譯階段完成的,所以在類型強制轉換時,你要保證轉換是有效的。說白了就是,類型必須是能轉的,比如這樣在編譯時會報錯。
<obj prop = "{x:Bind (string)Add(2,8)}" .../>
因為 int 類型是不能直接強制轉換為 string 類型的。
Bind 標記雖然逼格很高,但裝逼是有極限的,就目前而言,Bind 標記與方法綁定的功能還是有限的,畢竟在語法上不是那麽容易識別,將來也許會變強大一些。
就目前來說,Bind有以下局限:
a、不能綁定嵌套方法。這樣綁定是會掛的。
<obj prop = "{x:Bind sys:Math.Min( sys:int.Parse(txt1.Text), sys:int.Parse(txt2.Text) )}" ... />
在調用 Min 方法時,嵌套了 Parse 方法的調用,目前這樣做是不行的,編譯時會報錯。
b、參數與返回值的類型必須匹配。比如我們前面舉過例的那個 Add 方法,它接受兩個 int 類型的參數,如果我們這樣寫,也是有問題的。
<obj prop = "{x:Bind Add(txtBox1.Text, txtBox2.Text)}" .../>
TextBox的Text屬性是字符串類型,直接傳給int類型的參數是會出錯的。
再比如,這樣寫返回。
<TextBlock Text = "{x:Bind Add(3,6)}" .../>
Add 方法返回的是 int 類型的值,而 TextBlock 類的 Text 屬性是字符串類型的,此處也會報錯。
在引用其他 XAML 元素時,Bind 標記不需要像 Binding 元素那樣使用 ElementName 屬性來指定名稱。只要給相應的 XAML 元素命名,然後就可以直接引用了。比如這樣。
<TextBox x:Name="txtFirst" /> <TextBlock Text = "{x:Bind txtFirst.Text}" />
要把 TextBlock 對象的 Text 屬性與前面 TextBox 的 Text 屬性綁定,TextBox 是數據源,只要它一個名字,然後就可以直接引用了,txtFirst.Text。
下面給大家演示一個簡單的例子,一起來用 x:Bind 來裝裝X。
這個例子是這樣的:兩個文本框,分別輸入數值,然後在下方動態顯示兩個數值中較大的一個。比如,你輸入了 7 和 11,那麽,就顯示 11 。
這裏我們得考慮到局限性,因為 TextBox 類的 Text 屬性是 string 類型,所以不能直接與 Math類的 Max 方法綁定,這樣很難進行類型轉換,故我們最好進行一下封裝。
public class Test { public static string MaxNum(string s1, string s2) { double d1, d2; if (double.TryParse(s1, out double tmp)) d1 = tmp; else d1 = 0d; if (double.TryParse(s2, out double tmp2)) d2 = tmp2; else d2 = 0d; double res = Math.Max(d1, d2); return res.ToString("N"); } }
把計算方法定義為靜態的就行了,這樣可以直接拿來耍。
這個方法接收的參數是字符串類型,返回值也是字符串類型,為啥呢,你看了下面的XAML就知道了。
接下來,看看界面布局。
<StackPanel Margin="16"> <TextBox x:Name="txtNum1" Header="第一個數值:"/> <TextBox x:Name="txtNum2" Header="第二個數值:"/> <TextBlock> <Run Text="其中較大的一個數是:"/> <Run Foreground="Blue" FontSize="16" Text="{x:Bind local:Test.MaxNum(txtNum1.Text,txtNum2.Text),Mode=OneWay}"/> </TextBlock> </StackPanel>
因為顯示較大數值的是 Run 元素,它的 Text 屬性是字符串類型,為了避免出現類型轉換的錯誤,所以剛才的 MaxNum 方法要返回字符串類型。
這個地方,要顯式地 Mode 設置 OneWay,不然它會用 OneTime 來綁定,這樣就無法動態獲取計算結果了。
好了,運行一下,假設輸入 200.65 和 105.33,顯示的結果如下圖所示。
然後,我們把 200.65 改為 -300,結果如下圖。
你會發現,下方顯示的值是隨著輸入的變化實時更新的。
這樣耍是不是很有逼格呢?
完整的示例代碼請點擊這裏下載。
【Windows 10 應用開發】使用x:Bind標記動態獲得計算結果