星辰大海

人生万事须自为,跬步江山即寥廓

Caliburn.Micro 附带了一个名为 IoC 的静态服务定位器。这让你可以从代码中的任何地方访问 IoC 容器,就像这样:

1
2
var vm = IoC.Get<MyDialogViewModel>();
this.windowManager.ShowDialog(vm);

Stylet 没有包含这个,而且有很好的理由:我不想鼓励人们编写如此糟糕的代码。服务定位器模式经常被称为反模式。现在每个类都有一个对 IoC 的依赖(而不是它所依赖的实际类),您不能仅通过查看类的构造函数就知道它的依赖关系是什么,相反,您必须遍历代码以才能得知它对IoC.Get的调用。

IoC 也在 Caliburn 内部使用导致产生了一些糟糕的设计选择。这些已经在 Stylet 中重新架构,因此内部不再需要IoC。

如果你真的需要 IoC 的支持(尽管它会导致糟糕的代码风格),那么你可以很容易地编写自己的 IoC。首先创建这个静态 IoC 类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static class IoC
{
public static Func<Type, string, object> GetInstance = (service, key) => { throw new InvalidOperationException("IoC is not initialized"); };

public static Func<Type, IEnumerable<object>> GetAllInstances = service => { throw new InvalidOperationException("IoC is not initialized"); };

public static Action<object> BuildUp = instance => { throw new InvalidOperationException("IoC is not initialized"); };

public static T Get<T>(string key = null)
{
return (T)GetInstance(typeof(T), key);
}

public static IEnumerable<T> GetAll<T>()
{
return GetAllInstances(typeof(T)).Cast<T>();
}
}

然后在引导程序中添加下面的代码:

1
2
3
4
5
6
protected override void Configure()
{
IoC.GetInstance = this.Container.Get;
IoC.GetAllInstances = this.Container.GetAll;
IoC.BuildUp = this.Container.BuildUp;
}

概述(Overview)

BindableCollection<T>ObservableCollection<T> 的一个子类。如果你在你的 ViewModel 中有一个集合,并且想要将它用作你视图中的某个控件的 ItemsSource 等等,那么你就可以使用这个类(当一个项目被添加到/从集合中移除时,视图会得到通知)。

阅读全文 »

简介(Summary)

Execute 是一个小的静态帮助类,它使得在UI线程上运行委托变得更容易。它包装了 Application.Current.Dispatcher,并提供使其更容易和更简洁使用的方法。

它还提供了一个属性的帮助类:Execute.InDesignMode。当且仅当 Visual Studio 或 Expression Blend 设计器处于活动状态,并且代码为了设计时显示提供虚拟数据时。

下表给出了它提供的方法的总结,后面给出了更深入的解释:

Method Inline if possible Waits for Completion
Execute.OnUIThread
Execute.OnUIThreadSync ✔ (Blocks)
Execute.OnUIThreadAsync ✔ (Task)
Execute.PostToUIThread
Execute.PostToUIThreadAsync ✔ (Task)

Inline if possible: 该方法将检查当前线程是否为UI线程。如果是,则委托将同步运行。如果不是,那么它将以某种形式被分派到UI线程。

Waits for completion: 要么阻塞直到委托完成执行,要么返回一个任务,该任务在委托完成执行时完成。

阅读全文 »

可能容易实现 INotifyPropertyChanged,但通常是有点痛苦,想象一个对象需要propertychange 通知:你需要注册一个事件处理程序,检查属性名是否是你所期望的,完成后又需要注销事件处理程序。

这是一个很常见的问题,Stylet提供了一些方法来简化工作。

阅读全文 »

简介(Introduction)

“设计模式”或“设计时”指的是项目加载到 Visual Studio XAML 设计器或 Expression Blend 中时,显示的是 XAML 的呈现版本。大多数情况下,设计人员不会尝试评和估任何绑定,也不会为它们提供任何智能感知。然而,通过一些配置,您可以获得可爱的智能感知,并在视图中显示来自 ViewModel 的一些虚拟值。

Stylet 对设计模式有一些基本的支持。本文记录了它,并提供了如何使用它以及如何利用现有的 XAML 特性来增强设计时体验的说明。

阅读全文 »

简介

有时候,查看 Stylet 在幕后做了什么是很有用的,特别是当它没有做一些你期望它做的事情,或者做一些意想不到的事情的时候。

值得庆幸的是,Stylet 可以很容易地配置来生成日志输出,因此您可以了解它在做什么。

阅读全文 »