win10 uwp 繫結密碼

2022-01-15 12:18:49 字數 4164 閱讀 6906

win10 下,密碼框無法繫結到viewmodel,password是不可以繫結。

我們可以自己使用簡單方法去繫結

我們之前在wpf 使用繫結密碼框,我寫了一篇,關於如何繫結,我提供乙個我自己試了可以的類。

首先,我們新建乙個類,這個類是讓 passwordbox 可以繫結password。

uwp讓 passwordbox 可以繫結password 的乙個方法,其實我使用的和之前一樣。

我們新建靜態類,附件屬性,只是和之前有的小不一樣。

我們先寫乙個函式passwordchanged這個函式是 password 變化使用的,我們先判斷sender 是不是 passwordbox ,是的話我們就通知密碼改變。

通知使用setpassword(passwordbox, passwordbox.password);我們要先更新password,然後更新介面,但是我們設定password,會自動更新介面,一旦介面更新又更新 password,這樣不好,我們需要設定 updateing,如果是 true,就是我們介面更新,直接更新 password 。如果是 false,那麼是 password 更新介面。於是我們在 passwordchanged ,修改依賴屬性,必須新增是否後台修改密碼 isupdating ,如果是後台新增就需要設定他為 true,目的是可以讓前台修改通知,後台修改忽略,不然出現無限迴圈就不好。

setisupdating(passwordbox, true);

setpassword(passwordbox, passwordbox.password);

setisupdating(passwordbox, false);

然後寫private static void onpasswordpropertychanged(dependencyobject sender, dependencypropertychangedeventargs e)這個函式是我們定義的乙個屬性變化時,判斷 sender 是不是 passwordbox ,是的話,因為我們繫結是雙向,所以先把passwordbox.passwordchanged -= passwordchanged取消,然後判斷是不是更新了,如果更新了,也就是完成更新if (!(bool)getisupdating(passwordbox))我們就把新的value給passwordbox.password,不管有沒更新,我們需要passwordbox.passwordchanged += passwordchanged

private

static

void

onpasswordpropertychanged(dependencyobject sender,

dependencypropertychangedeventargs e)

passwordbox.passwordchanged += passwordchanged;}}

我們還需要乙個attach判斷使用者是不是要繫結,如果是 false ,就是和原來,不繫結

我們需要判斷 sender 是 passwordbox ,好像不是的話我們不需要做下,因為都是靜態,使用事件繫結,用的是 sender ,關於 sender 和 origin 其實是不同的,不過在這裡就使用 sender,不是路由事件。

我們判斷,在使用 oldvalue 是不是true,如果是的話,我們先把passwordbox.passwordchanged -= passwordchanged,不是的話不能passwordbox.passwordchanged -= passwordchanged,因為之前不是已經新增了,所以不可以再移除,即使新增了,也不會出錯。這樣在修改密碼就可以通過函式知道密碼已經修改,通過已經修改的密碼更新到附加屬性,就可以讓附加屬性得到密碼,繫結附加屬性,就可以讓vm得到值,於是這個核心就是這麼簡單。

判斷newvalue,如果是true,passwordbox.passwordchanged += passwordchanged;,這時就是繫結了,以後修改了密碼就可以知道了。

**可以複製到乙個檔案,注意需要使用他所在的name,使用xmlns引用需要用到

public

static

class passwordboxhelper

public

static

string

getpassword(dependencyobject element)

public

static

readonly dependencyproperty attachproperty = dependencyproperty.registerattached(

"attach", typeof(bool), typeof(passwordboxhelper), new propertymetadata(default(bool),attach));

public

static

void

setattach(dependencyobject element, bool

value)

public

static

bool

getattach(dependencyobject element)

public

static

readonly dependencyproperty isupdatingproperty = dependencyproperty.registerattached(

"isupdating", typeof(bool), typeof(passwordboxhelper), new propertymetadata(default(bool)));

public

static

void

setisupdating(dependencyobject element, bool

value)

public

static

bool

getisupdating(dependencyobject element)

private

static

void

onpasswordpropertychanged(dependencyobject sender,

dependencypropertychangedeventargs e)

passwordbox.passwordchanged += passwordchanged;}}

private

static

void

attach(dependencyobject sender,

dependencypropertychangedeventargs e)

改變前的值

if ((bool)e.oldvalue)//如果之前有繫結,我們就解綁

改變的值

if ((bool)e.newvalue)

}private

static

void

passwordchanged(object sender, routedeventargs e)}}

我們的 viewmodel 有乙個屬性 password ,注意我們使用 binding 把他繫結到 passwordbox 的密碼。繫結的過程

不需要去做修改,直接加上view:passwordboxhelper.attach="true" view:passwordboxhelper.password=""

**很簡單,也就是把 不可繫結的 password 改為下面的屬性

.attach="true"

view:passwordboxhelper.password=""

>

注意需要引用命名,好像屬性比較長,但是我也沒有好方法讓他比較好看

附加屬性使用的比較多,是不是需要我來寫乙個部落格說下什麼是附加屬性。

對於 wpf 幾乎和rt一樣的 附加屬性,如果沒有找到 好的部落格,直接去看 wpf就好啦,我在使用發現不需要去學新的東西就可以使用。

win10 uwp 繫結密碼

win10 下,密碼框無法繫結到viewmodel,password是不可以繫結。我們可以自己使用簡單方法去繫結 我們之前在wpf 使用繫結密碼框,我寫了一篇,關於如何繫結,我提供乙個我自己試了可以的類。首先,我們新建乙個類,這個類是讓 passwordbox 可以繫結password。uwp讓 p...

win10 uwp 繫結多資料

經常我們需要繫結的資料有多個,當新增到集合控制項的物件型別結構比較複雜,我們希望自己來定義排版布局,這時可以使用itemtemplate用資源的定義 現在有資料 識別符號 public string id 通訊人姓名 public string name public string contact ...

win10 uwp 繫結靜態屬性

jasoon 大神問,如何繫結靜態屬性。我們經常有靜態屬性,那麼我們如何繫結 假如我們的viewmodel有乙個靜態屬性 public static string cvte lindexi 乙個方法是在xaml.cs寫乙個屬性,get為靜態屬性。public string property view...