C 語法 訊息,MVVM的核心技術

2021-08-25 08:31:17 字數 3850 閱讀 7113

在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 函式作用域和語句塊作用域 一直以為函式內部申明的識別符號其作用域就叫做函式作用域,其實應該是語句塊作用域,它和函式作用域還是有區別的,語句塊作用域的作用範圍是從申明處開始,到包...