【整理總結】代碼沉澱 - Caliburn.Micro - MV*模式短小精悍的框架

Caliburn.Micro - Xaml made easy. html

web: https://github.com/Caliburn-Micro/Caliburn.Micro
document: http://caliburnmicro.com/documentation/
nuget: Install-Package Caliburn.Microgit

用於創建各個XAML平臺應用,如WPF,Silverlight,WP,支持MV*模式github


 更多相關項目,請訪問代碼沉澱目錄web

重要提示:請注意項目的版本,以官方最新版本爲準。bootstrap


 在以前很早的博文中,我大致上翻譯了一個系列的文章,只不過因爲CM框架更新太快,再加上一個主要緣由,本身翻譯文章太慢,一個一個單詞查,因此只翻譯了一大半,不過也足夠你們使用了。這一篇文章介紹的是V2和V3版本的稍微會新一些。不過新版本和舊版本主要用法差很少,請看下方的官方示範。app

Basic Configuration, Actions and Conventions

1. 啓動Visual Studio,新建一個解決方案 「Caliburn.Micro.Hello」,使用nuget方式(推薦),或者手動引用dll的方式,添加CM框架的類庫和System.Windows.Interactivity.dll。
刪除「MainPage.xaml」,修改 「App.xaml.cs」 ,以下方所示:框架

namespace Caliburn.Micro.Hello {
    using System.Windows;

    public partial class App : Application {
        public App() {
            InitializeComponent();
        }
    }
}

2. CM框架更推薦使用View-Model-First方式,咱們也這麼幹,建立第一個VM,名叫「ShellViewModel」,代碼以下:mvvm

namespace Caliburn.Micro.Hello {
    using System.Windows;

    public class ShellViewModel : PropertyChangedBase {
        string name;

        public string Name {
            get { return name; }
            set {
                name = value;
                NotifyOfPropertyChange(() => Name);
                NotifyOfPropertyChange(() => CanSayHello);
            }
        }

        public bool CanSayHello {
            get { return !string.IsNullOrWhiteSpace(Name); }
        }

        public void SayHello() {
            MessageBox.Show(string.Format("Hello {0}!", Name)); //Don't do this in real life :)
        }
    }
}

能夠看到,ShellViewModel 繼承自 PropertyChangedBase,這個基類簡單的定義了屬性通知,可實現簡單的通知界面更新功能。ide

3. 有了簡單的VM,下面咱們就定義一下 bootstrapper,創建一個新類「HelloBootstrapper」,代碼以下:this

namespace Caliburn.Micro.Hello {
    public class HelloBootstrapper : BootstrapperBase {
        public HelloBootstrapper() {
            Initialize();
        }

        protected override void OnStartup(object sender, StartupEventArgs e) {
            DisplayRootViewFor<ShellViewModel>();
        }
    }
}

這個 Bootsrapper 經過調用一個方法,定義了一個 「頂級ViewModel」。在程序啓動時,CM框架在初始化時,就會加載這個頂級VM,並顯示這個VM對應的View。
Bootsrapper 在一些常見的mvvm框架中,能夠看作是配置入口,好比配置設置,配置注入容器,等等。

4. 下一步,咱們用 HelloBootstrapper 替換默認的程序啓動方式,修改 「App.xaml」,以下所示:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Caliburn.Micro.Hello"
             x:Class="Caliburn.Micro.Hello.App">
    <Application.Resources>
        <local:HelloBootstrapper x:Key="bootstrapper" />
    </Application.Resources>
</Application>
Silverlight / Windows Phone

 WPF:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:Caliburn.Micro.Hello"
             x:Class="Caliburn.Micro.Hello.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <local:HelloBootstrapper x:Key="bootstrapper" />
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

 這裏,咱們爲 App 添加了一個資源,資源名爲「bootstrapper」,須要提醒的是,此處已經刪除了 「Application.StartupUri」 屬性的值,不須要經過默認方式啓動窗體,改成經過CM框架的bootstrapper方式啓動前面配置的那個  「頂級ViewModel」。

接下來,你能夠嘗試啓動你的程序,會看到界面中有以下字樣。 


Caliburn.Micro.Hello.ShellView not found.

Caliburn.Micro 已經創建了一個 ShellViewModel,可是它還不知道如何顯示,因此,咱們須要一個對應的 View,接下來咱們建立一個用戶控件(User Control),名叫 「ShellView」,xaml代碼以下: 

<UserControl x:Class="Caliburn.Micro.Hello.ShellView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <TextBox x:Name="Name" />
        <Button x:Name="SayHello"
                Content="Click Me" />
    </StackPanel>
</UserControl>

再次啓動你的程序,此次你就能看到剛剛定義的UI界面了。

嘗試在TextBox內輸入文字,當Button可用時,點擊它,能夠看到彈出了一個消息窗。

CM框架定義了一套簡潔有效的 「命名約定」 功能,用於匹配 View 和 ViewModel 之間的聯繫。
其實,它就是獲取到指定 VM 的全名,並移除了 「Model」 部分,剩下的部分即是對應的 View 了。
好比,對 「MyApp.ViewModels.MyViewModel」 來講,就會獲得 「MyApp.Views.MyView」。

對比一下 View 和 ViewModel,能發現,View中有一個 TextBox 控件,【x:Name=」Name」】 部分,實現了綁定到ViewModel中的 「Name」 屬性。還能發現,View中有一個 Button 控件,【x:Name=」SayHello」】部分,實現了綁定到ViewModel中的 」SayHello」 方法。最後ViewModel中還有一個 「CanSayHello」 屬性,會關聯到方法 「SayHello」,綁定功能的可用性如讓對應的按鈕不可用。

這些功能,是VM的ActionMessage(綁定至方法)功能,和Conventions(約定)功能的體現。

相關文章
相關標籤/搜索