UWP開發入門(三) x Bind 擴充套件標記

2021-09-22 22:06:36 字數 2986 閱讀 3865

原文:

uwp開發入門(三)——擴充套件標記

上週打爐石打得太晚……忘記更新了,本週補上。本篇我們講一下擴充套件標記。擴充套件標記也是windows 10 uinversal 新增的內容,按官方的說法是 的備用選項。雖然 缺少 中的一些功能,但它執行時所花費的時間和使用的記憶體量均比 要少,且支援更好的除錯。

首先我們來看一下的基本用法:

<

page

x:class

="xbindtest.mainpage"

xmlns

=""xmlns:x

=""xmlns:local

="using:xbindtest"

xmlns:d

=""xmlns:mc

=""mc:ignorable

="d"

>

<

grid

background=""

>

<

textblock

text=""

>

textblock

>

grid

>

page

>

public

sealed

partial

class

mainpage : page

public

mainpage()

}

和原先使用的binding最大的不同,就是不需要設定datacontext,而是從page(或者usercontrol)來尋找屬性進行繫結。值得注意的是,可能是為了強調效能,的預設繫結mode是onetime,而不是oneway。之前binding寫得太多的各位可能會思維定勢而忘記修改mode。

有的同學可能會說,既然以page作為繫結的預設源,是不是意味著就木有viewmodel啥事了,以後**就一股腦都寫在page.cs裡了?當然不是啦,因為每個page裡寫個viewmodel是很常見的事情啊,再通過viewmodel來進一層繫結屬性就可以了。

public

sealed

partial

class

hostview : page

public

hostview()

}

<

page

x:class

="quizgame.view.hostview"

...

>

<

button

content=""

...

/>

page

>

還有乙個非常神奇的地方,就是xaml裡寫了就可以直接在design檢視顯示出來。而binding則是沒有辦法做到的,這是因為 在編譯時就已經生成了一些奇怪的**(位於對應的page.g.cs檔案,該檔案可以在obj資料夾中找到)而 則是在執行時才獲取物件進行繫結。所以才能具有更好的效能。

在g.cs檔案中我們可以找到這樣的**:

private

void update_helloworld(global::system.string obj, int

phase)

}public

static

void set_windows_ui_xaml_controls_textblock_text(global::windows.ui.xaml.controls.textblock obj, global::system.string value, string

targetnullvalue)

obj.text = value ?? global

::system.string.empty;

}

在需要的時候,就可以打個斷點進行除錯了,雖然我覺得然並卵……

接下來說的非常重要,就是在datatemplate中如何使用,稍稍有別於在page的xaml裡,在datatemplate中使用必須要表明繫結的資料型別:

<

listview

itemssource=""

>

<

listview.itemtemplate

>

<

datatemplate

x:datatype

="local:person"

>

<

textblock

text=""

>

textblock

>

datatemplate

>

listview.itemtemplate

>

listview

>

還是那句話,是在編譯時處理繫結的,必須明確知道資料型別才能在g.cs裡生成一些奇怪的輔助資訊。

看看下面這張截圖,因為型別都在g.cs裡都生成好了,所以design檢視裡才能根據xaml生成對應的展示資料,這是binding所做不到的。

上面說了這麼多的優點,你是不是有些心動了呢?但是!終於到了說但是的時間了,還是存在一些比不過binding的地方:

除了以上這些,還會誘使一種叫做**潔癖的疾病發生。你想啊,都把datatype寫到xaml裡了,這特麼眼裡還有沒有mvvm和王法了,型別都暴露了一點隱私都沒有了。底下寫service的同事(請不要誤會底下的意思,這不是體位描寫)說:哎喲不好意思,我重構**把型別改了。你一看要改n個xaml檔案,抄起一把椅子就砸過去了,然後就被派出所帶走了……

所以這裡還是需要通過介面來減少依賴,舉個例子在mainpage裡通過iviewmodel,而不是具體的mainviewmodel來繫結,在datatemplate裡通過iperson,而不是person型別。這部分是物件導向的知識了,就不展開討論了。

本篇到此打住,再去開一盤爐石,我就不信薩滿打不上傳說……

PHP CPP開發擴充套件(三)

php cpp是乙個用於開發php擴充套件的c 庫。本節講解php函式形參相關的實現。有時候,我們需要指定函式的形參是陣列或者指定的,那麼在php cpp裡是否可以指定函式的引數型別呢?答案是可以的。示例 date 2018 7 include void example php parameters...

PHP CPP開發擴充套件(三)

php cpp是乙個用於開發php擴充套件的c 庫。本節講解php函式形參相關的實現。有時候,我們需要指定函式的形參是陣列或者指定的,那麼在php cpp裡是否可以指定函式的引數型別呢?答案是可以的。示例 date 2018 7 include void example php parameters...

PHP擴充套件開發入門

寫乙個最簡單的將字串全部變成大寫的函式 function my toupper str echo my toupper demo 現在我們開發乙個php擴充套件,實現my toupper的功能。step1 php提供了乙個擴充套件框架生成器 ext skel,這個工具在php原始碼的ext目錄 我的...