【Windows 10 應用開發】使用x:Bind標記動態獲得計算結果

來源:互聯網
上載者:User

標籤: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標記動態獲得計算結果

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.