国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

這篇具有很好參考價值的文章主要介紹了【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言:在C/S架構(gòu)上,WPF無疑已經(jīng)是“桌面一霸”了。在.NET生態(tài)環(huán)境中,很多小伙伴還在使用Winform開發(fā)C/S架構(gòu)的桌面應(yīng)用。但是WPF也有很多年的歷史了,并且基于MVVM的開發(fā)模式,受到了很多開發(fā)者的喜愛。

并且隨著工業(yè)化的進(jìn)展,以及幾年前微軟對.NET平臺的開源,國內(nèi)大多數(shù)企業(yè)的工業(yè)系統(tǒng)或上位機(jī)系統(tǒng),也慢慢從使用MFC、QT等C++平臺,轉(zhuǎn)向了.NET平臺。并且.NET平臺上,桌面應(yīng)用上,WPF由于其獨特的一些特性、以及可以制作動畫、無損圖像等,WPF的占比也越來越高。但是大多數(shù)小伙伴可能還是按照開發(fā)Winform的傳統(tǒng)思路來開發(fā)WPF,所以這篇文章當(dāng)做是一個使用MVVM模式開發(fā)的入門教程,希望大家在開發(fā)WPF的過程中,可以享受MVVM雙向綁定的快樂。

本篇文章有關(guān)環(huán)境說明:

開發(fā)環(huán)境: VS 2022企業(yè)版

.NET版本環(huán)境:.NET 6

開發(fā)的操作系統(tǒng)環(huán)境:Win 10

1、先創(chuàng)建一個WPF應(yīng)用程序,環(huán)境選擇.NET 6

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

2、創(chuàng)建完成以后,如下圖所示。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

3、再新建一個WPF類庫項目,用于存放所有第三方nuget包。此處純個人習(xí)慣,用于防止多項目引用包的時候,產(chǎn)生包版本不一致的問題。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

4、包項目里面,添加三個核心的包。分別是:Prism.Unity 、? ?Prism.Unity.Extensions? ?和??Unity.Microsoft.DependencyInjection??

其中,Prism.Unity 、? ?Prism.Unity.Extensions? 用于提供基礎(chǔ)的Prism框架有關(guān)的環(huán)境以及Unity容器。Unity.Microsoft.DependencyInjection? 用于提供可支持屬性注入的方式,如果不使用屬性注入,也可以不使用。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

5、WpfDemo項目里面,引用剛剛的包項目后,修改App.xaml文件里面的默認(rèn)配置項。以下是默認(rèn)的內(nèi)容:

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

6、替換為以下的內(nèi)容。以下內(nèi)容代表的是該程序引入prism框架。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

7、App.cs類里面,繼承改為PrismApplication,并且提供幾個方法的重寫。如果沒有重寫,可能會提示錯誤。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

8、都載入以后,運行程序,就可以啟動畫面了。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

9、項目新建Views文件夾和ViewModels文件夾。prism框架默認(rèn)會自動識別存在Views文件夾的為視圖端,ViewModels文件夾為VM端,用于自動雙向綁定的匹配使用。

并且VM類與Views視圖必須名稱對應(yīng),VM類的結(jié)尾必須是xxxViewModel。

先建立一個登錄頁面,存放于Views文件夾下,然后頁面引入prism框架所需的目錄,如圖所示。

同時設(shè)置了一個頁面名稱,該名稱后面當(dāng)做參數(shù)進(jìn)行傳遞使用。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

10、新建對應(yīng)Login窗體的VM類 LoginViewModel,并且繼承BindbleBase類,用于提供prism的雙向綁定功能。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

11、提供用戶名、密碼屬性,以及用于按鈕觸發(fā)的事件屬性。并且提供了一個模擬用戶登錄的方法。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

12、在Login.xaml文件下,新增兩個輸入框和一個按鈕,用于模擬用戶登錄功能和雙向綁定功能。Mode=TwoWay的意思是,前端數(shù)據(jù)變更,會自動同步到后端綁定的屬性上;后端綁定的屬性如果被修改值了,也會傳遞到前端進(jìn)行同步顯示。還有其他的Mode,小伙伴們可以自行去嘗試。

Command命令用于綁定事件屬性,并且提供了一個參數(shù),把當(dāng)前頁面當(dāng)做參數(shù)傳入進(jìn)去,用于頁面跳轉(zhuǎn)使用;如果不需要參數(shù)的情況下,直接不需要CommandParameter屬性就行。Command命令默認(rèn)是鼠標(biāo)單擊事件,如果是其他事件需要實現(xiàn),可以自定義做一些對應(yīng)的事件的封裝來進(jìn)行實現(xiàn)。

其他說明:任意屬性都是可以通過雙向綁定進(jìn)行實現(xiàn)的,包括控件名稱、以下label控件的content屬性、其他屬性等等一系列。大佬們可以自行玩玩,此處提供簡單案例,所以只對輸入框的Text屬性和按鈕的點擊事件提供了雙向綁定的功能。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

13、在App.cs類里面,提供InitializeShell方法的重寫,并且注冊Login頁面。此處可以實現(xiàn)啟動時候打開登錄頁面,通過提供DialogResult屬性以后,就可以打開CreateShell方法里面注冊的頁面了。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

14、現(xiàn)在運行程序,打開了登錄頁面,進(jìn)行驗證一下,如下圖所示,說明驗證生效了。輸入正確的用戶名和密碼就可以進(jìn)入到MainWindow頁面。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

15、接下來試試依賴注入的使用。先創(chuàng)建一個WPF類庫項目,提供一個LoginService類與接口當(dāng)做服務(wù);并提供UserLogin方法的實現(xiàn),如下圖所示。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

16、項目引用以后,提供屬性注入。屬性注入需要使用public,并且是屬性,以及添加 Dependency的標(biāo)記;如果是構(gòu)造函數(shù)注入,則無需這些步驟。然后在登錄方法里面,提供注入方法的使用,如下圖所示。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

17、在App.cs類里面,先前提供的重寫方法 RegisterTypes方法里面,進(jìn)行服務(wù)的注冊。

以下提供了一個瞬時生命周期的注入,如下所示。如果要使用其他生命周期,大佬們可以自行研究,都是自帶的,我就不多寫了。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

18、最后,運行程序,查看效果,程序運行符合預(yù)期,說明使用unity ioc容器進(jìn)行服務(wù)注冊成功。

【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

19、 后記——有關(guān)代碼奉上:

App.xaml?

<prism:PrismApplication x:Class="WpfDemo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfDemo"
             xmlns:prism="http://prismlibrary.com/">
    <Application.Resources>
         
    </Application.Resources>
</prism:PrismApplication>

App.cs

 public partial class App : PrismApplication  // Application
    {
        public App() { }

        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void InitializeShell(Window shell)
        {
            if (Container.Resolve<Login>().ShowDialog() == false)
            {
                Application.Current?.Shutdown();
            }
            else
            {
                base.InitializeShell(shell);
            }
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.Register<ILoginService, LoginService>();  // 默認(rèn)是transient注冊

        }
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
          
        }

LoginViewModel.cs

  public class LoginViewModel: BindableBase
    {
        [Dependency]  // using Unity;
        public ILoginService _loginService { get; set; }

        private string userName="";
        private string password="";

        public string UserName
        {
            get { return userName; }
            set { SetProperty(ref userName, value); }
        }

        public string Password
        {
            get { return password; }
            set { SetProperty(ref password, value); }
        }

        ICommand? loginCommand;
        public ICommand LoginCommand {
            get
            {
                if (loginCommand == null)
                {
                    loginCommand = new DelegateCommand<object>(UserLogin);

                }
                return loginCommand;
            }
        }

        void UserLogin(object obj)
        {
            if(!_loginService.UserLogin(this.UserName,this.Password))
            {
                MessageBox.Show("用戶名或密碼錯誤");
                return;
            }
            (obj as Window).DialogResult = true;

        }

    }

Login.xaml

<Window x:Class="WpfDemo.Views.Login"
        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:local="clr-namespace:WpfDemo.Views"
        xmlns:prism="http://prismlibrary.com/"
         prism:ViewModelLocator.AutoWireViewModel="True"
        mc:Ignorable="d" Name="loginWindow"
        Title="Login"  Height="400" Width="600">
    <Grid>
        <Label Content="用戶名" HorizontalAlignment="Left" Margin="56,119,0,0" VerticalAlignment="Top"/>
        <Label Content="密碼" HorizontalAlignment="Left" Margin="65,150,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Margin="112,124,0,0" TextWrapping="Wrap" 
                 Text="{Binding UserName,Mode=TwoWay}"  VerticalAlignment="Top" Width="143"/>
        <TextBox HorizontalAlignment="Left" Margin="112,154,0,0" TextWrapping="Wrap" 
                 Text="{Binding Password,Mode=TwoWay}"   VerticalAlignment="Top" Width="143"/>
        <Button Content="登錄" HorizontalAlignment="Left" Margin="166,192,0,0" 
                Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=loginWindow}"
                VerticalAlignment="Top" Height="24" Width="89"/>



    </Grid>
</Window>

LoginService.cs

 public class LoginService: ILoginService
    {
        public Boolean UserLogin(string userName, string password) {
            if(userName =="wesky" && password == "123456")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

    }

以上就是本篇文章的全部內(nèi)容,歡迎大佬們點贊、評論或轉(zhuǎn)發(fā)。如需轉(zhuǎn)發(fā),記得注明出處喲~ 謝謝大家圍觀。文章來源地址http://www.zghlxwxcb.cn/news/detail-459344.html

到了這里,關(guān)于【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • net6 winform使用依賴注入(IOC)

    net6 winform使用依賴注入(IOC)

    依賴注入(DI)是一種設(shè)計模式,它可以消除編程代碼之間的依賴性,因此可以很容易地管理和測試應(yīng)用程序。它有三種類型分別為構(gòu)造函數(shù)注入,屬性注入以及方法注入。它具有減少依賴性增強(qiáng)組件的可重用性等好處。 通俗的來說我們不通過 new 的方式在類內(nèi)部創(chuàng)建依賴類

    2024年02月05日
    瀏覽(19)
  • WPF框架Prism的使用 二

    這是第二篇關(guān)于Prism-WPF的介紹,第一篇中我們簡單介紹了Prism,然后講述了如何搭建一個MVVM的簡單頁面程序。其實我寫的文章就是把github上面的官方例子摘出來自己跑了一遍,然后加上了一些自己的理解,簡單給大家分享一下。 下面放上傳送門: 第一篇的鏈接 官方提供的示

    2024年04月10日
    瀏覽(26)
  • WPF超好用的框架Prism入門使用,上位機(jī)趕緊學(xué)起來!

    WPF框架Prism是一種用于開發(fā)模塊化、可重用和可測試的WPF應(yīng)用程序的框架。它提供了一種簡單而強(qiáng)大的方式來管理復(fù)雜應(yīng)用程序的代碼和構(gòu)建高度可擴(kuò)展的應(yīng)用程序。 如果您想使用Prism框架來開發(fā)WPF應(yīng)用程序,需要學(xué)習(xí)以下幾個方面: MVVM模式 :Prism基于MVVM模式,因此需要了

    2024年02月01日
    瀏覽(44)
  • 基于.net6的WPF程序使用SignalR進(jìn)行通信

    基于.net6的WPF程序使用SignalR進(jìn)行通信

    之前寫的SignalR通信,是基于.net6api,BS和CS進(jìn)行通信的。 .net6API使用SignalR+vue3聊天+WPF聊天_signalr wpf_故里2130的博客-CSDN博客 今天寫一篇關(guān)于CS客戶端的SignalR通信,后臺服務(wù)使用.net6api?。其實和之前寫的差不多,主要在于服務(wù)端以后臺進(jìn)程的方式存在,而客戶端以exe方式存在,

    2024年02月16日
    瀏覽(26)
  • .net core IOC容器實現(xiàn)(二) -- GetService

    使用IOC容器最重要的兩個步驟就是注入服務(wù)和從容器內(nèi)獲取服務(wù)實例。上一節(jié)聊的ServiceDescriptor其實就可以看成注入服務(wù)的步驟,這一節(jié)初步聊一聊獲取服務(wù)實例的相關(guān)源碼。 GetService GetService 方法是獲取服務(wù)實例的入口,位于 ServiceProvider 這個類中 從上面的代碼可以看出,主

    2024年02月09日
    瀏覽(28)
  • .net core IOC容器實現(xiàn)(一) -- ServiceDescriptor

    IOC 容器內(nèi)保存的程序運行過程中使用的服務(wù)實例。那么如果有些服務(wù)實例需要在運行時動態(tài)生成,比如,數(shù)據(jù)庫連接,不可能在程序運行過程中所有線程共用一條數(shù)據(jù)庫連接。所以 IOC 容器內(nèi)保存的 不是具體的服務(wù)實例,而是服務(wù)的相關(guān)信息 ,使用這個信息可以在程序運行

    2024年02月07日
    瀏覽(23)
  • .net core IOC 容器實現(xiàn)(四) -- CallSiteRuntimeResolver

    .net core IOC 容器實現(xiàn)(四) -- CallSiteRuntimeResolver

    上一節(jié)聊了一下 CallSite 是怎樣生成的,這一節(jié)我們來看一下 CallSite 是如何使用的。 先讓我們來回顧一下 CreateServiceAccessor 這個方法。 這段代碼跟 CallSite 有關(guān)的一共有三個地方,分別是 GetCallSite 和 Resolve(callSite,Root) 以及 _engine.RealizeService 。其中 GetCallSite 是用來生成 CallSite

    2024年02月16日
    瀏覽(22)
  • wpf中prism框架

    wpf中prism框架

    安裝prism包: 添加引用? ?修改完上述,重新生成項目 安裝Prism項目模板 ?安裝過程中關(guān)閉Visual Studio,安裝完畢再打開,即可創(chuàng)建prism框架的項目。

    2024年02月07日
    瀏覽(26)
  • 簡介WPF的Prism框架

    ????????Prism是一個用于在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構(gòu)建松散耦合、可維護(hù)和可測試的 XAML 應(yīng)用程序框架。 ????????Prism是一個用于在WPF、Xamarin Forms、Uno Platform和WinUI中構(gòu)建松耦合、可維護(hù)和可測試的XAML應(yīng)用程序的框架。 每個平臺都有獨立的版本,它們將按照

    2024年02月05日
    瀏覽(29)
  • 造個輪子-任務(wù)調(diào)度執(zhí)行小框架-IOC容器實現(xiàn)

    造個輪子-任務(wù)調(diào)度執(zhí)行小框架-IOC容器實現(xiàn)

    忙里偷閑,今天終于是把概率論這塊骨頭干下來了。所以的話,留了點時間,把整個項目的結(jié)構(gòu)和基本的功能給實現(xiàn)以下。通過昨天的一個功能的一個設(shè)計,我想應(yīng)該可以明白我想干啥吧。這里的話,重復(fù)一下,那就是俺們要搞一個任務(wù)執(zhí)行框架。 這個框架到底有啥用?舉個

    2024年02月13日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包