使用mvvm模式的wpf專案和傳統的使用事件驅動模式的wpf在處理邏輯有所不同,即使最簡單的開啟視窗也有很大差異。
public
static
class
windowmanager
//註冊視窗
public
static
void
regiter
(string key, type t)
//移除視窗
public
static
void
remove
(string key)
//開啟視窗
public
static
void
showdialog
(string key, object vm)
var win =
(window)activator.
createinstance
((type)_registerwindow[key]);
win.datacontext = vm;
win.
showdialog()
;}//開啟視窗
public
static
void
showdialog
(string key, object model,window window)
var win =
(window)activator.
createinstance
((type)_registerwindow[key]);
win.datacontext = model;
win.owner = window;
win.
showdialog()
;}}
public
static
class
windowextension
public
static
void
register
(this window win, string key, type t)
public
static
void register
(this window win, string key)
}
在viewmodel層的基類viewmodelbase中,除了定義開啟window視窗的方法外,還有messagebox訊息彈出框、檔案選擇對話方塊和資料夾選擇對話方塊。
public
class
viewmodelbase
: inotifypropertychanged
//開啟視窗並設定所屬視窗
public
void
showdialog
(string key,object args,window owner)
//訊息提示框
public
void
showmessage
(string mes, string title =
"", messageboxbutton buttons = messageboxbutton.ok)
//帶返回結果的訊息提示框
public bool showmessagewithresult
(string content,string title=
"",messageboxbutton button=messageboxbutton.okcancel)
else
}//檔案選擇對話方塊
public string showfiledialog
(string title,string filter=
"docx|*.docx"
,string folder=
"c:\\users\\administrator\\desktop"
)return filepath;
}//資料夾選擇對話方塊
public string showfolderdialog
(string title)
;return folderpath;
} #endregion
#region inotifypropertychanged
public event propertychangedeventhandler propertychanged;
protected internal virtual void
onpropertychanged
(string propertyname)
#endregion
}
在主視窗類mainwindow.xaml.cs中通過名稱註冊新的視窗。
public partial class
mainwindow
: metrowindow, isingletondependency
public
mainwindow()
}
在viewmodel層的類中,由於已經繼承了基類viewmodelbase,視窗管理相關的類都可以直接使用。
public
class
mainwindowviewmodel
: viewmodelbase
#region commands
public delegatecommands
opendemocommand
#endregion
#region methods
#region 開啟視窗示例
private
void
opendemowindow
(string obj)
#endregion
#endregion
}
WPF隨筆(十二) 使用MVVM模式
規模稍大的wpf專案一般會採用mvvm模式,常見的框架有prism mvvmlight caliburn等。今天就從頭開始建立乙個使用mvvm模式的wpf專案,對mvvm也能有乙個更好的了解。實現inotifypropertychanged介面是為了利用wpf的資料繫結特性,當資料來源發生變化時,能...
WPF程式設計,MVVM模式下控制項獲得焦點的一種方法。
mvvm模式下,viewmodel層無法直接控制項view層的控制項,這裡通過為控制項增加資料觸發器的方法,讓控制項獲得焦點。一般用於輸入輸出時讓控制項獲得焦點。其中,isfocus是vm層的乙個布林量,當為真時,textbox控制項獲得當前的焦點,用於輸入鍵盤直接輸入資料。需要注意的是,要為控制項...
MVVM模式和在WPF中的實現
我大概是從2102年底開始接觸wpf,之前一直用winform。剛開始看了下感覺跟winform區別不大,控制項可以拖進去,選中了控制項屬性面板可以設定屬性 事件面板可以監聽事件,後台 處理事件,一切都那麼的熟悉。xaml布局也跟android布局很像,所以沒學習就直接開始了,覺得摸索摸索基本就差不...