title
author
date
createtime
categories
win10 uwp 繫結密碼
lindexi
2018-2-13 17:23:3 +0800
2018-2-13 17:23:3 +0800
win10 uwp
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
privatestatic
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引用需要用到
publicstatic
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 改為下面的屬性
<passwordbox
view:passwordboxhelper.attach
="true"
view:passwordboxhelper.password=""
>
注意需要引用命名,好像屬性比較長,但是我也沒有好方法讓他比較好看
附加屬性使用的比較多,是不是需要我來寫乙個部落格說下什麼是附加屬性。
對於 wpf 幾乎和rt一樣的 附加屬性,如果沒有找到 好的部落格,直接去看 wpf就好啦,我在使用發現不需要去學新的東西就可以使用。
本文同時發在九幽專欄
win10 uwp 繫結密碼
win10 下,密碼框無法繫結到viewmodel,password是不可以繫結。我們可以自己使用簡單方法去繫結 我們之前在wpf 使用繫結密碼框,我寫了一篇,關於如何繫結,我提供乙個我自己試了可以的類。首先,我們新建乙個類,這個類是讓 passwordbox 可以繫結password。uwp讓 p...
win10 uwp 重啟軟體
在16299支援在軟體自己重啟,不需要讓使用者點選關閉然後啟動,雖然我還不知道這個有什麼用。本文告訴大家如何讓軟體關閉重新開啟 首先需要使用的版本是 16299 然後使用 requestrestartasync 方法就可以關閉軟體重新開啟。下面就是簡單的軟體 100 horizontalalignm...
win10 uwp 繫結密碼
win10 下,密碼框無法繫結到viewmodel,password是不可以繫結。我們可以自己使用簡單方法去繫結 我們之前在wpf 使用繫結密碼框,我寫了一篇,關於如何繫結,我提供乙個我自己試了可以的類。首先,我們新建乙個類,這個類是讓 passwordbox 可以繫結password。uwp讓 p...