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

Caliburn.Micro - Xaml made easy. 

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

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


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

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


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

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”,代碼如下:

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,這個基類簡單的定義了屬性通知,可實現簡單的通知界面更新功能。

3. 有了簡單的VM,下面我們就定義一下 bootstrapper,建立一個新類“HelloBootstrapper”,代碼如下:

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(約定)功能的體現。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章