一、首启窗体设置

1. 创建一个新的WPF应用程序并添加NuGet包:Caliburn.Micro

2. 删除项目自带的主窗口文件MainWindow.xaml

3. 在App.xaml项目文件中,删除StartupUri="MainWindow.xaml"节点特性,并添加ResourceDictionary:

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

4. 新建Bootstrapper.cs类,继承:BootstrapperBase,并在此类中设置首启窗体(这里设置ShellView为首启窗体):

     public class Bootstrapper:BootstrapperBase
{
public Bootstrapper()
{
Initialize();
} protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<ShellViewModel>();
}
}

二、命名规范

1.View和ViewModel的关联

在项目中新建文件夹Models、Views、ViewModels(一定要记得加s),前缀名相同的View和ViewModel默认是一组(例如:ShellView和ShellViewModel),会自动关联。

2. 属性关联

ViewModel中:

写具有通知功能的属性,可以写成自定义的代码模板(例如:我写成了propcn或propcnh),

可以只通知自己的同名UI属性(FirstName),也可通知相关联的其他UI属性(FullName),也可通知相关联的按钮使能方法(CanClearText),

赋初值是给字段赋值

         private string _firstName = "Tim";
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
NotifyOfPropertyChange(() => FirstName);
NotifyOfPropertyChange(() => FullName);
NotifyOfPropertyChange(() => CanClearText);
}
} public string FullName
{
get { return $"{FirstName} {LastName}"; }
}

View中:

一对一时:可直接关联给标签的名字<TextBox x:Name="CityName"/>

一对多时:使用绑定<TextBox Text="{Binding Path=CityName,Mode=OneWay}"/>

关联的是属性的属性时使用下划线:<  ...  x:Name="SelectedPerson_FirstName"/>

3. 方法关联

View中按钮关联点击方法:

<Button Grid.Row="4" Grid.Column="1" cal:Message.Attach="[Event Click] = [Action ClearText]">Clear Names</Button>

可以在方法中传入参数,参数是一个集合:

<Button cm:Message.Attach="[Event Click] = [Action Show(‘woo~’)]">

可以用分号;来表示多个方法,如:

<Button cm:Message.Attach="[Event MouseEnter] = [Action Show('Enter')];
[Event MouseLeave] = [Action Show('Leave')]" />

小括号()传入参数时不仅可以传入字符串,也可以使用绑定,如:

<TextBlock x:Name="txtBlock" Text="woo~"/>
<Button cm:Message.Attach="[Event Click] = [Action Show(txtBlock.Text)]">

可以与其他控件绑定,点击按钮执行该控件的某方法:

<ListBox x:Name="lstBox"  SelectionMode="Extended">
<ListBoxItem>123</ListBoxItem>
<ListBoxItem>123</ListBoxItem>
<ListBoxItem>123</ListBoxItem>
</ListBox>
<Button cm:Action.Target="{Binding ElementName=lstBox}" Focusable="False"
cm:Message.Attach="[Event Click] = [Action SelectAll]">

有多种按钮事件时,View中添加xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity",并将关联方法们这样写:

 <Button Grid.Row="4" Grid.Column="1" Content="Clear Names">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="ClearText" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>

ViewModel中按钮的点击方法和使能方法:

注意:使能方法只受与UI关联的属性影响,其他的可绑定按钮本身的IsEnable属性操作。

         public bool CanClearText()
{
if (String.IsNullOrWhiteSpace(FirstName) && String.IsNullOrWhiteSpace(LastName))
{
return false;
}
else
{
return true;
}
} public void ClearText()
{
FirstName = "";
LastName = "";
}

三、主子窗体

1. 主窗体

Windows类型,通常让ViewModel继承 Conductor<object>,下面介绍三种继承的区别:

Conductor<T> ——管理一个单一Screen。一旦激活一个新的屏幕,任何先前的Screen会被关闭,会通过 conductor 进行管理。用于非常简单的导航/显示(navigation/display)方案。

Conductor<T>.Collection.OneActive ——管理多个Screen,并允许在同一时间里存在一个激活的Screen,很像一个选项卡控件。当Screen被激活,以前的活动Screen被停用,不会关闭,也不会通过conductor管理遗留。Screens可以显式地关闭和移除。这种类型的conductor还负责激活Screens中的某一个,如果当前活动Screen关闭。

Conductor<T>.Collection.AllActive ——和上一个Conductor非常类似,但允许多个屏幕处于活动状态。

2. 子窗体

User Control类型,ViewModel继承 Screen

3. 主窗体中调用子窗体

View中:<ContentControl x:Name="ActiveItem"/>

ViewModel中:ActivateItem(new GlobalViewModel());

Action的参考:解析Caliburn.Micro(二)

Caliburn.Micro(MVVM框架)的更多相关文章

  1. WPF +MVVM(Caliburn.Micro)项目框架

    最近做了一个软件,这个软件不是网站,但是与HTML,AJAX等技术密切相关,也不是只有单纯的数据库增删改查,还涉及到线程协调,比较复杂的文本处理…… 这样的软件,用OA,ERP的框架显然是不合适的,因 ...

  2. 开源框架Caliburn.Micro

    Caliburn.Micro学习笔记----引导类和命名匹配规则   用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeple ...

  3. 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...

  4. 【整理总结】代码沉淀 - Caliburn.Micro - MV*模式短小精悍的框架

    Caliburn.Micro - Xaml made easy. web: https://github.com/Caliburn-Micro/Caliburn.Microdocument: http ...

  5. MVVM Caliburn.Micro学习记录

    wpf中MVVM一直用的自己写的框架,最近试了试Caliburn.Micro. Caliburn.Micro可以通过x:name来进行属性和事件绑定. 比如 <Button x:Name=&qu ...

  6. Caliburn Micro框架

    Caliburn Micro框架快速上手(WP)   一.使用nuget添加起始工程 二.修改App.xaml文件和App.xaml.cs文件 AppBootstrapper介绍: AppBootst ...

  7. Caliburn.Micro - 框架搭建

    简介:Caliburn.Micro是Caliburn的一个轻量级版本开源架构,可以用于wpf,sliverlight,wp7等,和注重模块化的Prism比起来也有许多优点,具体比较可以参考 此文 ht ...

  8. Xamarin 的 MVVM 之 Caliburn.Micro

    约定 Caliburn.Micro 以下简称 CMXamarin.Form 以下简称 XF 摘要CM 当前已释出 3.0 beta 版https://github.com/Caliburn-Micro ...

  9. Caliburn.Micro框架之Action Convertions

    首先新建一个项目,名称叫Caliburn.Micro.ActionConvertions 然后删掉MainWindow.xaml 然后去app.xaml删掉StartupUri这行代码 其次,安装Ca ...

随机推荐

  1. tortoise svn 请求的名称有效,但是找不到请求的类型的数据

    可能是博客园出bug了,现在无法放图,间断重复刷新十多次依然如故,弃之 这个问题是在安装完svn服务器(visual svn)后复制url,tortoise svn import 粘贴url后 出现的 ...

  2. OJ_单词倒排

    题目描述:对字符串中的所有单词进行倒排. 说明: 1.每个单词是以26个大写或小写英文字母构成,可以用一个“-”中连接线连接单词两部分表示一个单词,但是仅限一个“-”,出现两个“--”则为非构成单词的 ...

  3. Spring框架的属性注入

    1. 对于类成员变量,常用的注入方式有两种 * 构造函数注入(没有空的构造方法注入) * 属性setter方法注入(有空的构造方法注入) 2. 在Spring框架中提供了前两种的属性注入的方式 1. ...

  4. Vim基础教程

    一.简介 世界上只有三种编辑器,EMACS.VIM和其它. 我们所处的时代是非常幸运的,有越来越多的编辑器,相对于古老的VIM和EMACS,它们被称为现代编辑器.我们来看看这两个古董有多大年纪了: * ...

  5. 记录pytorch的几个问题

    1.Variable里面的creator没有,网上博客上面说有,奇怪??

  6. 学习Java的方法

    许多人在刚开始学习Java时,会因为学习方法的不正确,而丧失信心,从而半途而废.所以,今天,巩固就要教教大家学习Java的方法. 1.多练习 编程其实是一个非常抽象的东西,要想学好它,就不能只是看看书 ...

  7. 2018.07.04 POJ 1113 Wall(凸包)

    Wall Time Limit: 1000MS Memory Limit: 10000K Description Once upon a time there was a greedy King wh ...

  8. 着重基础之—MySql Blob类型和Text类型

    着重基础之—MySql Blob类型和Text类型 在经历了几个Java项目后,遇到了一些问题,在解决问题中体会到基础需要不断的回顾与巩固. 最近做的项目中,提供给接口调用方数据同步接口,传输的数据格 ...

  9. 《Linux多线程服务端编程——使用muduo C++网络库》读书笔记

    第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C++多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线 ...

  10. HDU 1716 排列2 (格式问题+排列)

    题意:. 析:我们完全可以STL里面的函数next_permutation(),然后方便,又简单,这个题坑就是在格式上. 行末不能有空格,结尾不能有空行,不大好控制,必须控制好第一次数. 这个题本应该 ...