wpf-MVVM+IOC/ID
一、简介
承接上文《WPF-理解与使用MVVM,请勿滥用》;这里讲解 MVVM+IOC/ID 的案例。本文IOT方式参考于《WPF ViewModel打开窗体方法总结 》,这个案例是每次打开一个窗体时都new一个,窗体不是单例;想使用单例窗体可以注入一个。
代码地址:https://gitee.com/qq28069933146_admin/wpf_mvvm_simple
二、MVVM+IOC/ID案例
1、定义窗口服务接口:
public interface IWindowService
{
void WindowShow<T>(Window owner = null) where T : Window, new();
void WindowShowDialog<T>(Window owner = null) where T : Window, new();
}
2、实现服务:
/// <summary>
/// 开启窗体
/// </summary>
public class WindowService : IWindowService
{
/// <summary>
/// 开启(展示)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="owner">父窗体</param>
public void WindowShow<T>(Window owner = null) where T : Window, new()
{
var window = new T();
if (owner != null)
window.Owner = owner;
window.Show();
}
/// <summary>
/// 开启(展示)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="owner">父窗体</param>
public void WindowShowDialog<T>(Window owner = null) where T : Window, new()
{
var window = new T();
if (owner != null)
window.Owner = owner;
window.ShowDialog();
}
}
3、注册服务(在App.xaml.cs):
public partial class App : Application
{
public static IServiceProvider Services { get; set; }
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// 依赖注入
Services = ServiceCollection();
this.MainWindow = new MainWindow();
this.MainWindow?.Show();
}
/// <summary>
/// 注册服务
/// </summary>
/// <returns></returns>
private static IServiceProvider ServiceCollection()
{
var service = new ServiceCollection();
//service.AddTransient<Album>();
service.AddSingleton<ILogTool, LogTool>();
service.AddSingleton<IWindowService, WindowService>();
// ViewModel
service.AddSingleton<MainViewModel>();
service.AddSingleton<MsgViewModel>();
// View
//service.AddSingleton<MainWindow>();
//service.AddScoped<MsgWindow>();
return service.BuildServiceProvider();
}
}
4、调用服务(MainViewModel.cs)
public partial class MainViewModel : ViewModelBase
{
#region 变量
private ILogTool _logTool;
private IWindowService _windowService;
#endregion 变量
#region 变量 - 控件 Binding
省略...
#endregion 变量 - 控件 Binding
#region 窗体事件
// 通过构造函数注入
public MainViewModel() { }
// 通过构造函数注入
public MainViewModel(ILogTool logTool, IWindowService windowService)
{
_logTool = logTool;
_windowService = windowService;
}
省略...
#endregion 窗体事件
#region 控件事件
public IRelayCommand Button2Command => new RelayCommand(Button2Fun);
/// <summary>
/// 弹出信息框
/// </summary>
public void Button2Fun()
{
_logTool.WriteLog("您点击了弹出信息框按钮");
var msgWindow = App.Services.GetService<MsgViewModel>();
if (msgWindow!=null)
msgWindow.Msg = "您点击了弹出信息框按钮";
//
_windowService.WindowShowDialog<MsgWindow>(App.Current.MainWindow);
}
#endregion 控件事件
}
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/19089194

浙公网安备 33010602011771号