男人当强 發表於 2022-3-5 13:42:00

【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

<p><span style="font-family: arial, helvetica, sans-serif; font-size: 18px"><strong>前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。</strong></span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 18px"><strong>并且随着工业化的进展,以及几年前微软对.NET平台的开源,国内大多数企业的工业系统或上位机系统,也慢慢从使用MFC、QT等C++平台,转向了.NET平台。并且.NET平台上,桌面应用上,WPF由于其独特的一些特性、以及可以制作动画、无损图像等,WPF的占比也越来越高。但是大多数小伙伴可能还是按照开发Winform的传统思路来开发WPF,所以这篇文章当做是一个使用MVVM模式开发的入门教程,希望大家在开发WPF的过程中,可以享受MVVM双向绑定的快乐。</strong></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 15px">本篇文章有关环境说明:</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><em><span style="font-size: 15px">开发环境: VS 2022企业版</span></em></span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><em><span style="font-size: 15px">.NET版本环境:.NET 6</span></em></span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><em><span style="font-size: 15px">开发的操作系统环境:Win 10</span></em></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif"><em><span style="font-size: 15px"><br></span></em>1、先创建一个WPF应用程序,环境选择.NET 6</span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305121022265-1681252663.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">2、创建完成以后,如下图所示。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305122225592-1798995885.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">3、再新建一个WPF类库项目,用于存放所有第三方nuget包。此处纯个人习惯,用于防止多项目引用包的时候,产生包版本不一致的问题。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305122300641-930069410.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">4、包项目里面,添加三个核心的包。分别是:Prism.Unity 、&nbsp; &nbsp;Prism.Unity.Extensions&nbsp; &nbsp;和&nbsp;&nbsp;Unity.Microsoft.DependencyInjection&nbsp;&nbsp;</span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">其中,Prism.Unity 、&nbsp; &nbsp;Prism.Unity.Extensions&nbsp; 用于提供基础的Prism框架有关的环境以及Unity容器。Unity.Microsoft.DependencyInjection&nbsp; 用于提供可支持属性注入的方式,如果不使用属性注入,也可以不使用。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305122502654-615143115.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">5、WpfDemo项目里面,引用刚刚的包项目后,修改App.xaml文件里面的默认配置项。以下是默认的内容:</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305122800073-1920938957.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">6、替换为以下的内容。以下内容代表的是该程序引入prism框架。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305122920109-929569694.png" alt=""></span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">7、App.cs类里面,继承改为PrismApplication,并且提供几个方法的重写。如果没有重写,可能会提示错误。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305123200637-311005778.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">8、都载入以后,运行程序,就可以启动画面了。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305125940941-1115922505.png" alt=""></span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">9、项目新建Views文件夹和ViewModels文件夹。prism框架默认会自动识别存在Views文件夹的为视图端,ViewModels文件夹为VM端,用于自动双向绑定的匹配使用。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">并且VM类与Views视图必须名称对应,VM类的结尾必须是xxxViewModel。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">先建立一个登录页面,存放于Views文件夹下,然后页面引入prism框架所需的目录,如图所示。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">同时设置了一个页面名称,该名称后面当做参数进行传递使用。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305130033350-161161705.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">10、新建对应Login窗体的VM类 LoginViewModel,并且继承BindbleBase类,用于提供prism的双向绑定功能。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305130429944-886257170.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">11、提供用户名、密码属性,以及用于按钮触发的事件属性。并且提供了一个模拟用户登录的方法。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305130800964-2096781031.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">12、在Login.xaml文件下,新增两个输入框和一个按钮,用于模拟用户登录功能和双向绑定功能。Mode=TwoWay的意思是,前端数据变更,会自动同步到后端绑定的属性上;后端绑定的属性如果被修改值了,也会传递到前端进行同步显示。还有其他的Mode,小伙伴们可以自行去尝试。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">Command命令用于绑定事件属性,并且提供了一个参数,把当前页面当做参数传入进去,用于页面跳转使用;如果不需要参数的情况下,直接不需要CommandParameter属性就行。Command命令默认是鼠标单击事件,如果是其他事件需要实现,可以自定义做一些对应的事件的封装来进行实现。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px"><strong>其他说明</strong>:任意属性都是可以通过双向绑定进行实现的,包括控件名称、以下label控件的content属性、其他属性等等一系列。大佬们可以自行玩玩,此处提供简单案例,所以只对输入框的Text属性和按钮的点击事件提供了双向绑定的功能。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305130916577-1918676153.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">13、在App.cs类里面,提供InitializeShell方法的重写,并且注册Login页面。此处可以实现启动时候打开登录页面,通过提供DialogResult属性以后,就可以打开CreateShell方法里面注册的页面了。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305131441238-1506086703.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">14、现在运行程序,打开了登录页面,进行验证一下,如下图所示,说明验证生效了。输入正确的用户名和密码就可以进入到MainWindow页面。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305131710972-2037487374.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">15、接下来试试依赖注入的使用。先创建一个WPF类库项目,提供一个LoginService类与接口当做服务;并提供UserLogin方法的实现,如下图所示。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305131807965-1336037185.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">16、项目引用以后,提供属性注入。属性注入需要使用public,并且是属性,以及添加 Dependency的标记;如果是构造函数注入,则无需这些步骤。然后在登录方法里面,提供注入方法的使用,如下图所示。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305131942107-1016009913.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">17、在App.cs类里面,先前提供的重写方法 RegisterTypes方法里面,进行服务的注册。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">以下提供了一个瞬时生命周期的注入,如下所示。如果要使用其他生命周期,大佬们可以自行研究,都是自带的,我就不多写了。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305132147062-866403238.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">18、最后,运行程序,查看效果,程序运行符合预期,说明使用unity ioc容器进行服务注册成功。</span></p>
<p><span style="font-family: arial, helvetica, sans-serif"><img src="https://img2022.cnblogs.com/blog/1995789/202203/1995789-20220305132440485-1808421540.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">19、 后记——有关代码奉上:</span></p>
<p><span style="font-family: 幼圆; font-size: 16px"><strong>App.xaml&nbsp;</strong></span></p>
<div class="cnblogs_code">
<pre>&lt;prism:PrismApplication x:Class=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">WpfDemo.App</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
             xmlns</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://schemas.microsoft.com/winfx/2006/xaml/presentation</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
             xmlns:x</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://schemas.microsoft.com/winfx/2006/xaml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
             xmlns:local</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">clr-namespace:WpfDemo</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
             xmlns:prism</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://prismlibrary.com/</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;Application.Resources&gt;
         
    &lt;/Application.Resources&gt;
&lt;/prism:PrismApplication&gt;</pre>
</div>
<p>&nbsp;</p>
<p><strong><span style="font-family: 幼圆; font-size: 16px">App.cs</span></strong></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">partial</span> <span style="color: rgba(0, 0, 255, 1)">class</span> App : PrismApplication<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Application</span>
<span style="color: rgba(0, 0, 0, 1)">    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> App() { }

      </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)"> Window CreateShell()
      {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> Container.Resolve&lt;MainWindow&gt;<span style="color: rgba(0, 0, 0, 1)">();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> InitializeShell(Window shell)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Container.Resolve&lt;Login&gt;().ShowDialog() == <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                Application.Current</span>?<span style="color: rgba(0, 0, 0, 1)">.Shutdown();
            }
            </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">.InitializeShell(shell);
            }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> RegisterTypes(IContainerRegistry containerRegistry)
      {
            containerRegistry.Register</span>&lt;ILoginService, LoginService&gt;();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 默认是transient注册</span>
<span style="color: rgba(0, 0, 0, 1)">
      }
      </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
      {
         
      }</span></pre>
</div>
<p>&nbsp;</p>
<p><strong><span style="font-family: 幼圆; font-size: 16px">LoginViewModel.cs</span></strong></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> LoginViewModel: BindableBase
    {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> using Unity;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> ILoginService _loginService { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">string</span> userName=<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">string</span> password=<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> UserName
      {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span> { <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> userName; }
            </span><span style="color: rgba(0, 0, 255, 1)">set</span> { SetProperty(<span style="color: rgba(0, 0, 255, 1)">ref</span><span style="color: rgba(0, 0, 0, 1)"> userName, value); }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> Password
      {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span> { <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> password; }
            </span><span style="color: rgba(0, 0, 255, 1)">set</span> { SetProperty(<span style="color: rgba(0, 0, 255, 1)">ref</span><span style="color: rgba(0, 0, 0, 1)"> password, value); }
      }

      ICommand</span>?<span style="color: rgba(0, 0, 0, 1)"> loginCommand;
      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> ICommand LoginCommand {
            </span><span style="color: rgba(0, 0, 255, 1)">get</span><span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (loginCommand == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                {
                  loginCommand </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> DelegateCommand&lt;<span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">(UserLogin);

                }
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> loginCommand;
            }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">void</span> UserLogin(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> obj)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(!_loginService.UserLogin(<span style="color: rgba(0, 0, 255, 1)">this</span>.UserName,<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.Password))
            {
                MessageBox.Show(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">用户名或密码错误</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            (obj </span><span style="color: rgba(0, 0, 255, 1)">as</span> Window).DialogResult = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;

      }

    }</span></pre>
</div>
<p>&nbsp;</p>
<p><strong><span style="font-family: 幼圆; font-size: 16px">Login.xaml</span></strong></p>
<div class="cnblogs_code">
<pre>&lt;Window x:Class=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">WpfDemo.Views.Login</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      xmlns</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://schemas.microsoft.com/winfx/2006/xaml/presentation</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      xmlns:x</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://schemas.microsoft.com/winfx/2006/xaml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      xmlns:d</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://schemas.microsoft.com/expression/blend/2008</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      xmlns:mc</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://schemas.openxmlformats.org/markup-compatibility/2006</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      xmlns:local</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">clr-namespace:WpfDemo.Views</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      xmlns:prism</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://prismlibrary.com/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
         prism:ViewModelLocator.AutoWireViewModel</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">True</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      mc:Ignorable</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">d</span><span style="color: rgba(128, 0, 0, 1)">"</span> Name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">loginWindow</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      Title</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Login</span><span style="color: rgba(128, 0, 0, 1)">"</span>Height=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">400</span><span style="color: rgba(128, 0, 0, 1)">"</span> Width=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">600</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;Grid&gt;
      &lt;Label Content=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">用户名</span><span style="color: rgba(128, 0, 0, 1)">"</span> HorizontalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Left</span><span style="color: rgba(128, 0, 0, 1)">"</span> Margin=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">56,119,0,0</span><span style="color: rgba(128, 0, 0, 1)">"</span> VerticalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Top</span><span style="color: rgba(128, 0, 0, 1)">"</span>/&gt;
      &lt;Label Content=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">密码</span><span style="color: rgba(128, 0, 0, 1)">"</span> HorizontalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Left</span><span style="color: rgba(128, 0, 0, 1)">"</span> Margin=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">65,150,0,0</span><span style="color: rgba(128, 0, 0, 1)">"</span> VerticalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Top</span><span style="color: rgba(128, 0, 0, 1)">"</span>/&gt;
      &lt;TextBox HorizontalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Left</span><span style="color: rgba(128, 0, 0, 1)">"</span> Margin=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">112,124,0,0</span><span style="color: rgba(128, 0, 0, 1)">"</span> TextWrapping=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Wrap</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
               Text</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{Binding UserName,Mode=TwoWay}</span><span style="color: rgba(128, 0, 0, 1)">"</span>VerticalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Top</span><span style="color: rgba(128, 0, 0, 1)">"</span> Width=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">143</span><span style="color: rgba(128, 0, 0, 1)">"</span>/&gt;
      &lt;TextBox HorizontalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Left</span><span style="color: rgba(128, 0, 0, 1)">"</span> Margin=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">112,154,0,0</span><span style="color: rgba(128, 0, 0, 1)">"</span> TextWrapping=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Wrap</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
               Text</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{Binding Password,Mode=TwoWay}</span><span style="color: rgba(128, 0, 0, 1)">"</span>   VerticalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Top</span><span style="color: rgba(128, 0, 0, 1)">"</span> Width=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">143</span><span style="color: rgba(128, 0, 0, 1)">"</span>/&gt;
      &lt;Button Content=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">登录</span><span style="color: rgba(128, 0, 0, 1)">"</span> HorizontalAlignment=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Left</span><span style="color: rgba(128, 0, 0, 1)">"</span> Margin=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">166,192,0,0</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                Command</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{Binding LoginCommand}</span><span style="color: rgba(128, 0, 0, 1)">"</span> CommandParameter=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{Binding ElementName=loginWindow}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                VerticalAlignment</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Top</span><span style="color: rgba(128, 0, 0, 1)">"</span> Height=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">24</span><span style="color: rgba(128, 0, 0, 1)">"</span> Width=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">89</span><span style="color: rgba(128, 0, 0, 1)">"</span>/&gt;



    &lt;/Grid&gt;
&lt;/Window&gt;</pre>
</div>
<p>&nbsp;</p>
<p><strong><span style="font-family: 幼圆; font-size: 16px">LoginService.cs</span></strong></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> LoginService: ILoginService
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> Boolean UserLogin(<span style="color: rgba(0, 0, 255, 1)">string</span> userName, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> password) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(userName ==<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wesky</span><span style="color: rgba(128, 0, 0, 1)">"</span> &amp;&amp; password == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }

    }</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: arial, helvetica, sans-serif; font-size: 16px">以上就是本篇文章的全部内容,欢迎大佬们点赞、评论或转发。如需转发,记得注明出处哟~ 谢谢大家围观。</span></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <div style="text-align: left">
    <p>本文作者:Wesky</p>
    <p>微信号:WeskyNet001</p>
    <p>公众号:Dotnet Dancer</p>
    <p>文章链接:https://www.cnblogs.com/weskynet/p/15967764.html</p>
    <img src="https://images.cnblogs.com/cnblogs_com/blogs/686424/galleries/2427775/o_241023072701_GZH.jpg" alt="微信公众号二维码" />
    <p>欢迎扫一扫关注公众号,发现更多其他技术分享</p>
</div><br><br>
来源:https://www.cnblogs.com/weskynet/p/15967764.html
頁: [1]
查看完整版本: 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入