NET Core 3 WPF MVVM框架 Prism系列之數據綁定

一.安裝Prism

1.使用程序包管理控制檯#

<code>

Install-Package

Prism

.Unity

-Version

7

.2

.0

.1367

/<code>

也可以去掉‘-Version 7.2.0.1367’獲取最新的版本

2.使用管理解決方案的Nuget包#

NET Core 3 WPF MVVM框架 Prism系列之數據綁定


在上面或許我們有個疑問?為啥安裝prism會跟Prism.Unity有關係,我們知道Unity是個IOC容器,而Prism本身就支持IOC,且目前官方支持幾種IOC容器:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定


1.且unity由於是微軟官方的,且支持prism的組件化,由此我推薦使用prism.unity,在官方文檔中prism7不支持prism.Mef,Prism 7.1將不支持prism.Autofac2.安裝完prism.unity就已經包含著所有prism的核心庫了,架構如下:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定


二.實現數據綁定

我們先創建Views文件夾和ViewModels文件夾,將MainWindow放在Views文件夾下,再在ViewModels文件夾下面創建MainWindowViewModel類,如下:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定


xmal代碼如下:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定

<code>

<

Window

x:Class

=

"PrismSample.Views.MainWindow"

xmlns

=

"http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x

=

"http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d

=

"http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc

=

"http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:prism

=

"http://prismlibrary.com/"

xmlns:local

=

"clr-namespace:PrismSample"

mc:Ignorable

=

"d"

Title

=

"MainWindow"

Height

=

"450"

Width

=

"800"

prism:ViewModelLocator.AutoWireViewModel

=

"True"

>

<

StackPanel

>

<

TextBox

Text

=

"{Binding Text}"

Margin

=

"10"

Height

=

"100"

FontSize

=

"50"

Foreground

=

"Black"

BorderBrush

=

"Black"

/>

<

Button

Height

=

"100"

Width

=

"300"

Content

=

"Click Me"

FontSize

=

"50"

Command

=

"{Binding ClickCommnd}"

/>

StackPanel

>

Window

>

/<code>
NET Core 3 WPF MVVM框架 Prism系列之數據綁定

ViewModel代碼如下:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定

<code>

using

Prism.Commands;

using

Prism.Mvvm;

namespace

PrismSample.ViewModels

{

public

class

MainWindowViewModel

:

BindableBase

{

private

string

_text;

public

string

Text {

get

{

return

_text; }

set

{ SetProperty(

ref

_text,

value

); } }

private

DelegateCommand _clickCommnd;

public

DelegateCommand ClickCommnd => _clickCommnd ?? (_clickCommnd =

new

DelegateCommand(ExecuteClickCommnd));

void

ExecuteClickCommnd

(

)

{

this

.Text =

"Click Me!"

; }

public

MainWindowViewModel

(

)

{

this

.Text =

"Hello Prism!"

; } } }/<code>
NET Core 3 WPF MVVM框架 Prism系列之數據綁定

啟動程序:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定


點擊 click Me 按鈕:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定


可以看到,我們已經成功的用prism實現數據綁定了,且View和ViewModel完美的前後端分離

但是現在我們又引出了另外一個問題,當我們不想按照prism的規定硬要將View和ViewModel放在Views和ViewModels裡面,又或許自己的項目取名規則各不相同怎麼辦,這時候就要用到另外幾種方法:

1.更改命名規則#


如果,公司命名規則很變態,導致項目結構變成這樣(這種公司辭職了算了):

NET Core 3 WPF MVVM框架 Prism系列之數據綁定


首先我們在App需要引入prism,修改‘Application’為‘prism:PrismApplication’且刪除StartupUrixmal代碼如下:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定

<code>

<

prism:PrismApplication

x:Class

=

"PrismSample.App"

xmlns

=

"http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x

=

"http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:prism

=

"http://prismlibrary.com/"

xmlns:local

=

"clr-namespace:PrismSample"

>

<

Application.Resources

>

Application.Resources

>

prism:PrismApplication

>

/<code>
NET Core 3 WPF MVVM框架 Prism系列之數據綁定

cs後臺代碼如下:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定

<code>

using

Prism.Unity;

using

Prism.Ioc;

using

Prism.Mvvm;

using

System.Windows;

using

PrismSample.Viewsb;

using

System;

using

System.Reflection;

namespace

PrismSample

{

public

partial

class

App

:

PrismApplication

{

protected

override

Window

CreateShell

(

)

{

return

Container.Resolve(); }

protected

override

void

RegisterTypes

(

IContainerRegistry containerRegistry

)

{ }

protected

override

void

ConfigureViewModelLocator

(

)

{

base

.ConfigureViewModelLocator(); ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) => {

var

viewName = viewType.FullName.Replace(

".Viewsb."

,

".ViewModelsa.OhMyGod."

);

var

viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;

var

viewModelName =

$"

{viewName}

Test,

{viewAssemblyName}

"

;

return

Type.GetType(viewModelName); }); } } }/<code>
NET Core 3 WPF MVVM框架 Prism系列之數據綁定

上面這兩句是關鍵:


".Viewsb." 表示View所在文件夾namespace,".ViewModelsa.OhMyGod." 表示ViewModel所在namespace1var viewName = viewType.FullName.Replace(".Viewsb.", ".ViewModelsa.OhMyGod.");

  

Test表示ViewModel後綴

<code>

var

viewModelName =

$"

{viewName}

Test,

{viewAssemblyName}

"

;/<code>

2.自定義ViewModel註冊#


我們新建一個Foo類作為自定義類,代碼如下:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定

<code>

using

Prism.Commands;

using

Prism.Mvvm;

namespace

PrismSample

{

public

class

Foo

:

BindableBase

{

private

string

_text;

public

string

Text {

get

{

return

_text; }

set

{ SetProperty(

ref

_text,

value

); } }

public

Foo

(

)

{

this

.Text =

"Foo"

; }

private

DelegateCommand _clickCommnd;

public

DelegateCommand ClickCommnd => _clickCommnd ?? (_clickCommnd =

new

DelegateCommand(ExecuteClickCommnd));

void

ExecuteClickCommnd

(

)

{

this

.Text =

"Oh My God!"

; } } }/<code>
NET Core 3 WPF MVVM框架 Prism系列之數據綁定


修改App.cs代碼:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定

<code>

protected

override

void

ConfigureViewModelLocator

(

)

{

base

.ConfigureViewModelLocator(); ViewModelLocationProvider.Register(); }/<code>
NET Core 3 WPF MVVM框架 Prism系列之數據綁定


運行:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定

點擊按鈕:

NET Core 3 WPF MVVM框架 Prism系列之數據綁定


就算是不註釋修改命名規則的代碼,我們發現運行結果還是一樣,因此我們可以得出結論,

這種直接的,不通過反射註冊的自定義註冊方式優先級會高點,在官方文檔也說明這種方式效率會高點

且官方提供4種方式,其餘三種的註冊方式如下:

<code>ViewModelLocationProvider.Register(

typeof

(MainWindow).

ToString

(),

typeof

(MainWindowTest)); /<code>
<code>ViewModelLocationProvider.Register(

typeof

(MainWindow).ToString(),

()

=>

Container.Resolve());/<code>
<code>ViewModelLocationProvider.Register(

()

=>

Container.Resolve());/<code>


作者: RyzenAdorer

出處:


https://www.cnblogs.com/ryzen/p/11905866.html


分享到:


相關文章: