在c#中訊息有兩個指向,乙個指向message,乙個指向inotify。這裡主要講inotify。
inotify也有人稱之為[通知],不管叫訊息還是通知,都是乙個意思,就是傳遞資訊。
inotify訊息其實是乙個介面,介面名叫inotifypropertychanged。介面定義如下:
//向客戶端發出某一屬性值已更改的通知。
public
inte***ce inotifypropertychanged
定義很簡單,我們可以看到這個介面只定義了乙個事件屬性——propertychanged。所以這個propertychanged就是訊息的核心了。
那麼學習應用訊息的方法就出現了,即,建立乙個繼承inotifypropertychanged介面的類,然後在類內,實現propertychanged就可以了。
上面介紹訊息是用來傳遞資訊的。那麼可能會有同學好奇,引用型別的物件不就可以封裝傳遞資訊嗎?為什麼還要用訊息呢?
因為有些資料是儲存在非引用型別的物件中的。比如字串,或數字等。
為了讓字串、數字等資料的修改也能如引用型別一樣,可以傳遞歸給源,就需要使用訊息了。
下面我們來看下訊息的基礎用法。
xmlns=""
xmlns:x=""
title="windownotify"
height="120"
width="200">
name="txtname"
verticalalignment="top"
height="24" >
textbox>
name="txtnamenotify"
verticalalignment="top"
height="24" >
textbox>
click="button_click"
height="30"
content="檢視結果">
button>
stackpanel>
grid>
window>
public
partial
class windownotify : window
set
}windownotifyviewmodel vm;
public
windownotify()
private
void
button_click(object sender, routedeventargs e)
}public
class windownotifyviewmodel : inotifypropertychanged
set}
}}
這裡我們建立了乙個viewmodel——windownotifyviewmodel,我們讓這個vm繼承inotifypropertychanged,然後定義了乙個kname屬性,並定義了propertychanged事件觸發的位置。
有同學可能會好奇,propertychanged事件是何時被賦值的呢?別心急,請耐心往下看。
viewmodel定義完成之後,我們再看xaml對應的cs檔案。這裡我們也定義了乙個kname屬性。然後初始化時,將cs檔案的kname和vm的kname分別賦值給前台定義的兩個textbox控制項。
這裡用vm的kname屬性賦值時,稍微有點特別,稍後再介紹。
可以從圖中看到,介面修改了textbox的text屬性,windownotifyviewmodel的kname屬性對修改的值進行了同步,而windownotify的kname沒有同步。
看完結果,我們回過來看下vm的kname的奇怪賦值方式。我們先看第一句:
binding bding =new binding();
這裡的binding是繫結的意思,這行**很明顯是用來定義乙個繫結。
繫結是個不好理解的詞,我們該如何理解呢?
很簡單,我們可以將繫結理解為套索,既然是套索,那麼就該有兩個屬性,乙個是套頭,乙個是套尾。
那麼宣告了套索之後,我們便需要為套索的索尾賦值了,即資料來源的這一方。
**裡,我們通過binding的path和source設定了索尾的資料來源和資料來源繫結的屬性。之後我們還設定了繫結模式是雙向繫結,即雙方修改都會進行資料傳遞。
設定好了套索後,我們在讓textbox控制項自己轉進套頭裡,並設定了textbox控制項繫結的屬性。**如下:
txtnamenotify.setbinding(textbox.textproperty, bding);
在我們textbox控制項自己轉進套頭裡的時候,會對資料來源的propertychanged進行賦值,這樣我們就實現了字串資料的傳輸。
當然,這樣賦值看起來比較笨拙。那麼有更簡便的方法嗎。
答案當然是:有。
上面的**已經實現了viewmodel,那麼只要在這個基礎上進行優化,即可實現最簡單的mvvm的應用。
優化xaml**如下:
name="txtnamenotify"
text=""
verticalalignment="top"
height="24" >
textbox>
click="button_click"
height="30"
content="檢視結果">
button>
stackpanel>
優化xaml.cs**如下:
public
partial
class windownotify : window
private
void
button_click(object sender, routedeventargs e)
}public
class windownotifyviewmodel : inotifypropertychanged
set}
}}
從上面的**中,我們可以看到在xaml檔案中,text屬性可以使用這種簡寫的模式,來實現剛才那個複雜的binding賦值。
而在xaml.cs檔案中,我們將veiwmode賦值給了datacontext這個資料上下文,然後,我們就看到了,前台直接使用了vm裡的屬性。
這樣簡單的mvvm就實現了。
在上面我們看到了viewmodel的建立和使用,但viewmode中每個屬性都要設定成如此複雜的形態,稍微有點難受。
那麼,我們來用callermembername繼續簡化這個viewmodel。
優化後的**如下:
public
class windownotifyviewmodel : baseviewmodel
set}
}public
class baseviewmodel : inotifypropertychanged
}}
如上所示,我們定義了乙個baseviewmodel,並在baseviewmodel裡面定義方法onpropertychanged,並在裡面實現事件propertychanged的觸發定義。
最後我們通過callermembername特性,在方法onpropertychanged裡來獲取觸發該方法的屬性的名稱。
然後我們就實現了,比較簡潔的viewmodel。
ps:callermembername的用法就好像param引數一樣,只要如上所示,寫進去即可。
到此,訊息的應用就講完了。訊息毫無疑問是mvvm的技術核心。學會訊息才能更好的理解mvvm。
並且學會訊息,還能幫助我們更好的理解現在流行的前端js的mvvm。雖然實現方式不一樣,但道理是一樣的。
C 語法 訊息,MVVM的核心技術。
摘要 在c 中訊息有兩個指向,乙個指向message,乙個指向inotify。這裡主要講inotify。inotify也有人稱之為 通知 不管叫訊息還是通知,都是乙個意思,就是傳遞資訊。訊息的定義inotify訊息其實是乙個介面,介面名叫inotifypropertychanged。在c 中訊息有兩...
C 語法 訊息,MVVM的核心技術。
在c 中訊息有兩個指向,乙個指向message,乙個指向inotify。這裡主要講inotify。inotify也有人稱之為 通知 不管叫訊息還是通知,都是乙個意思,就是傳遞資訊。訊息的定義 inotify訊息其實是乙個介面,介面名叫inotifypropertychanged。介面定義如下 向客戶...
c語言核心技術 一
c語言編譯分析記號,有乙個原則是盡可能靠左合併符號使其得到符合語法的記號,所以 a b 會被解釋為 a b 而不是 a b 函式作用域和語句塊作用域 一直以為函式內部申明的識別符號其作用域就叫做函式作用域,其實應該是語句塊作用域,它和函式作用域還是有區別的,語句塊作用域的作用範圍是從申明處開始,到包...