標籤:content 產生 zip sam target 出錯 ack 動態綁定 .com
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標記動態獲得計算結果