UWP 實現 FindAncestor 繫結

2022-01-12 19:38:49 字數 4194 閱讀 1280

在 wpf 裡,我們是可以在 relativesource 上面實現的,舉個例子:

<

grid

tag="2"

>

<

button

>

<

grid

tag="1"

>

<

textblock

text

=", path=tag, mode=oneway}

"/>

grid

>

button

>

grid

>

將 relativesource 的 mode 設定為 findancestor 就可以了。ancestortype 代表繫結的型別,ancestorlevel 代表查詢第幾個,預設是 1。所以在上面的例子裡,由於 ancestorlevel 是 2,所以查詢出來的是 tag 等於 2 的那個 grid。假如設定成 3,那就查詢不到了。

但是,在 uwp 裡,微軟出於效能考慮,把 findancestor 給去掉了,relativesource 的 mode 只剩下了 self 和 templateparent。但是需求永遠是存在的,那麼總得有個解決方案吧,假如你搜尋過 google 或者 stackoverflow,無一不例外就是改成通過 elementname 來繫結,也就是上面的例子會變成如下這樣:

<

grid

x:name

="targetgrid"

tag="2"

>

<

button

>

<

grid

tag="1"

>

<

textblock

text=""

/>

grid

>

button

>

grid

>

說實話這樣也能用,而且效能更好了,一直以來,我自己的 uwp 專案也是通過這種方式來解決。

<

controls:imageex

x:name

="targetimage"

>

<

controls:imageex.loadingtemplate

>

<

datatemplate

>

<

progressbar

maximum

="1"

value=""

/>

datatemplate

>

controls:imageex.loadingtemplate

>

controls:imageex

>

這樣單個 imageex 就沒問題了,但是需求再進一步,我需要所有的 imageex 都是這樣,loadingtemplate 是一致的。在此刻,我們已經沒辦法通過繫結 elementname 的方式來解決問題了。

俗話說,不行就包一層。xaml 裡包一層的話,那就是 contentcontrol 了,這裡我們建立乙個叫 ancestorbindingassist 的模板控制項,繼承自 contentcontrol。

cs **如下:

public

class

ancestorbindingassist : contentcontrol

public

intancestorlevel

public

type ancestortype

public

dependencyobject source

protected

override

void

private

static

void

onancestorlevelchanged(dependencyobject d, dependencypropertychangedeventargs e)

obj.updatesource();

}private

static

void

onancestortypechanged(dependencyobject d, dependencypropertychangedeventargs e)

private

void

updatesource()

}

ancestortype 和 ancestorlevel 兩個屬性跟 wpf 裡一致,然後提供乙個 source 屬性提供給下級繫結。在 ancestortype 或者 ancestorlevel 發生變化時,則呼叫 updatesource 方法重新整理 source。updatesource 方法裡的 getancestors 來自 winrtxamltoolkit。

xaml **的話就很簡單了,因為這裡只是包一層。

<

style

targettype

="local:ancestorbindingassist"

>

<

setter

property

="template"

>

<

setter.value

>

<

controltemplate

targettype

="local:ancestorbindingassist"

>

<

contentpresenter

/>

controltemplate

>

setter.value

>

setter

>

style

>

<

grid

tag="2"

>

<

button

>

<

grid

tag="1"

>

<

local:ancestorbindingassist

x:name

="bindingassist"

ancestorlevel

="2"

ancestortype

="grid"

>

<

textblock

text=""

/>

local:ancestorbindingassist

>

grid

>

button

>

grid

>

各位看官可能會吐槽,這跟直接繫結 elementname 好像沒啥區別,而且還更複雜了。但是這裡我們再舉上面我那個 imageex 的例子,現在我們想所有 imageex 復用 loadingtemplate 就可以這麼寫了:

<

style

targettype

="controls:imageex"

>

<

setter

property

="loadingtemplate"

>

<

setter.value

>

<

datatemplate

>

<

local:ancestorbindingassist

x:name

="bindingassist"

ancestortype

="controls:imageex"

>

<

progressbar

maximum

="1"

value=""

/>

local:ancestorbindingassist

>

datatemplate

>

setter.value

>

setter

>

style

>

這樣就能所有的 imageex 都能復用 loadingtemplate 了。而這是簡單的繫結 elementname 所做不到的。

UWP連線mysql 實現資料遠端備份

昨晚吃飯的時候突然覺得我們這個uwp應該添個資料備份的功能,不然換手機,換電腦之後資料庫就全沒了.一開始是想用微軟提供的azure的,沒想到這玩意又沒什麼資料而且申請試用的時候還讓我交身份證 審核.誰知道要審核多久,於是我選擇了在自己的伺服器上搞個mysql服務,然後在uwp裡面連線上去.沒想到過程...

UWP 列表項寬度自適應的實現

在uwp開發中,我們常常用到兩個顯示列表的控制項 listview和gridview。而這兩個列表控制項在pc等大螢幕上如果能多列 智慧型 調整自己的大小 通常是根據當前視窗大小調整寬度 那麼使用者就會在同一螢幕內接收到更多資訊,同時空間的利用率得以提高,也會提高應用的視覺體驗。這是我的第一篇部落格...

UWP檔案寫入

使用c 開發uwp應用時,遇到乙個異常的問題 在部分win10裝置使用 file類 寫檔案失敗 看了下獲取可寫目錄的 沒問題,如下 有問題還望指正 string getwritablepath const 檢視該資料夾的許可權,讀寫許可權也都有,不知為何使用fwrite一直寫檔案失敗 哪位大神知曉,...