1. 程式人生 > >【Windows 10 應用開發】使用x:Bind標記動態獲得計算結果

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

ash 進行 reg tps 屬性綁定 使用 例子 應用 處理

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