C#MVVM框架——Caliburn.Micro使用

一.简介

CliburnMicro是一个基于.NET平台的轻量级MVVM(Model-View-ViewModel)框架。它旨在简化WPF(Windows Presentation Foundation)和Silverlight应用程序的开发过程。CliburnMicro提供了一套简洁而强大的绑定机制,帮助开发者实现视图和视图模型之间的数据绑定和命令绑定,以及处理用户输入和反馈等任务。使用CliburnMicro,开发者可以更加高效地构建可测试、可扩展和易维护的应用程序。

二.使用

1.使用Nuget搜索Caliburn.Micro进行安装使用。

2.Caliburn.Micro的使用和初始化

新建一个子类AppBootstapper 继承框架的BootstrapperBase类,并重写框架父类的初始化和启动方法。

public class AppBootstapper : BootstrapperBase
{
    #region Fields

    //IOC容器声明
    private CompositionContainer _container;
    private IWindowManager _windowManager;
    private IEventAggregator _eventAggregator;
    private IThemeManager _themeManager;
    private Logger _logger;

    #endregion




    public AppBootstapper()
    {
        Initialize();
    }


    #region Overrides
    protected override void Configure()
    {
        AggregateCatalog aggregateCatalog = new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>());
        _container = new CompositionContainer(aggregateCatalog);

        var batch = new CompositionBatch();

        //注入IoC
        batch.AddExportedValue(_container);

        _windowManager = new WindowManager();
        batch.AddExportedValue(_windowManager);
        _eventAggregator = new EventAggregator();
        batch.AddExportedValue(_eventAggregator);
        _logger = new Logger();
        batch.AddExportedValue(_logger);
        _themeManager = new ThemeManager();
        batch.AddExportedValue(_themeManager);

        _container.Compose(batch);
    }

    protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        base.OnUnhandledException(sender, e);
    }

    protected override object GetInstance(Type service, string key)
    {
        string contract = string.IsNullOrEmpty(key)
           ? AttributedModelServices.GetContractName(service)
           : key;

        var exports = _container.GetExportedValues<object>(contract);

        if (exports.Any())
            return exports.First();

        throw new Exception($"找不到实例 {contract}。");
    }

    protected override IEnumerable<Assembly> SelectAssemblies()
    {
        var assemblies = new List<Assembly>()
        {
            Assembly.GetEntryAssembly(),
            Assembly.GetExecutingAssembly(),
        };

        return assemblies.Where(x => x != null)
            .Distinct();
    }

    protected override IEnumerable<object> GetAllInstances(Type service)
    {
        return _container.GetExportedValues<object>(AttributedModelServices.GetContractName(service));
    }

    protected override void BuildUp(object instance)
    {
        _container.SatisfyImportsOnce((ComposablePart)instance);
    }

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        _windowManager.ShowWindowAsync(new ShellViewModel());
    }
    #endregion

}

 替换App.xaml里面自带的Url启动方式

 使用Caliburn.Micro框架的启动方式,添加系统资源字典,声明子类的标签和x:Key。

<Application x:Class="ProjectM.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:ProjectM"
             xmlns:com="clr-namespace:ProjectM.Components">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <com:AppBootstapper x:Key="bootstapper"/>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

3. AppBootstapper 重写和调用父类方法

3.1 Initialize():初始化Caliburn.Micro框架;

3.2 override void Configure():应用程序启动时的一个重要步骤,通过调用合适的配置方法和注册逻辑,可以确保应用程序能够正确地运行和配置相关的组件和服务。在这个方法内部可以将系统常用组件注入到容器中。

3.3 override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e):处理应用程序中的未处理异常。

3.4 override void OnStartup(object sender, StartupEventArgs e):应用启动后执行。

4. AppBootstapper 对象初始化

4.1 CompositionContainer

用来创建和管理组合部件(composition parts)的容器。组件发现和创建;组件组合和注入;生命周期管理。

在Configure方法中,我们创建了一个AggregateCatalog来加载程序集(这里使用的是当前程序集),然后创建了一个CompositionContainer并进行组合。

在CompositionBatch中,我们注册了IWindowManager,IEventAggregator和其他的实例,以便 Caliburn.Micro 在需要时可以进行依赖注入。最后,通过调用_container.Compose(batch)来触发组合过程。

在GetInstance方法中,我们使用CompositionContainer的GetExportedValues方法来获取满足特定契约(contract)的导出值(exports)。如果存在满足条件的导出对象,则使用第一个导出对象作为实例返回。

4.2 IWindowManager

是 Caliburn.Micro MVVM 框架中的控制窗口管理的接口。它定义了一组方法,用于创建、显示和关闭窗口,以及管理窗口之间的导航。

//1.创建和显示窗口:
var windowManager = new WindowManager();
windowManager.ShowWindow(new ShellViewModel());

//2.关闭窗口:
windowManager.Close(new ShellViewModel());

//3.显示模态对话框:
var result = windowManager.ShowDialog(new MessageViewModel("This is a modal dialog!"));

//4.窗口导航:
windowManager.NavigateToViewModel<DashboardViewModel>();

 4.3 IEventAggregator

是 Caliburn.Micro MVVM 框架中的事件聚合器接口。它提供了一种用于发布和订阅事件的解耦机制,以方便在应用程序的各个部分之间进行通信和交互。

4.3.1 .定义事件类:创建一个公共的事件类,该类可以包含任何你想要传递的事件数据。

public class MyEvent
{
    public string Message { get; set; }
}

4.3.2 发布事件:在需要发布事件的地方,获取 IEventAggregator 的实例,并使用其 PublishOnUIThread 或 PublishOnBackgroundThread 方法来发布事件。你可以使用方法参数将事件实例传递给订阅者。

private readonly IEventAggregator _eventAggregator;

public MyPublisher(IEventAggregator eventAggregator)
{
    _eventAggregator = eventAggregator;
}

public void PublishEvent()
{
    _eventAggregator.PublishOnUIThread(new MyEvent { Message = "Hello, subscribers!" });
}

4.3.3 订阅事件:在需要订阅事件的地方,获取 IEventAggregator 的实例,并使用其 Subscribe 方法来订阅事件。可以通过实现 IHandle<T> 接口,并在订阅时将订阅者自身传递给 Subscribe 方法。

public class MySubscriber : IHandle<MyEvent>
{
    private readonly IEventAggregator _eventAggregator;

    public MySubscriber(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.Subscribe(this);
    }

    public void Handle(MyEvent message)
    {
        // 处理事件
        Console.WriteLine(message.Message);
    }
}

5. IOC容器对象使用

public class ViewModelBase
    : Screen
{
    public IWindowManager WindowManager =>
        IoC.Get<IWindowManager>();

    public IEventAggregator EventAggregator 
        => IoC.Get<IEventAggregator>();

    public ILogger Logger
        => IoC.Get<ILogger>();

    public IThemeManager ThemeManager 
        => IoC.Get<IThemeManager>();
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Caliburn.Micro是一套基于XAML的MVVM模式的开发框架,它是一个小巧而强大的框架。在Caliburn.Micro中,只需要按照约定将View的名字加上后缀ViewModel,就是它的ViewModel的名字,例如MainPage和MainPageViewModel。Caliburn.Micro会自动将ViewModel绑定到View的DataContext,并且如果ViewModel的属性名和控件的名称相同,它会自动进行绑定。 MVVM模式是一种用于开发WPF应用程序的架构模式,它将应用程序分为三个部分:Model、View和ViewModel。ViewModel负责处理View与Model之间的交互,以及将Model的数据呈现给View。MVVM模式的目标是编写优雅、可测试、可维护和可扩展的表示层代码,而Caliburn.Micro努力超越简单的MVVM实现,使开发变得更加容易。 在MVVM框架中,ViewModel通常需要实现INotifyPropertyChanged接口,以便在ViewModel的属性更改时能够自动发出事件通知View。在Caliburn.Micro中,ViewModel通常可以继承自PropertyChangedBase或Screen,这两个类都实现了INotifyPropertyChanged接口。如果继承自Screen,ViewModel可以像窗口一样进行激活、关闭等操作。 综上所述,Caliburn.Micro是一个基于XAML的MVVM框架,它使开发WPF应用程序变得更加简单和高效。它提供了自动绑定ViewModel到View的功能,同时也支持INotifyPropertyChanged接口,使ViewModel能够与View进行双向通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C# WPF MVVM开发框架Caliburn.Micro入门介绍①](https://blog.csdn.net/zls365365/article/details/121711023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [WPF MVVM框架Caliburn.Micro(一)简介](https://blog.csdn.net/Accidentabird/article/details/130192466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值