在第2部分和第3部分,我曾经讲了界面生成选项和Spa对象,不过那时读者还不是很了解Spa工程,此时读者已经非常了解Spa工程了。在这一部分中,我们再来强化一下上面学到的知识。
1. 界面生成选项
界面生成选项中的ValidationTrigger枚举理解起来很简单:
PropertyChanged:代表控件改变后立即验证
LostFocus:代表控件失去焦点后验证
Explicit:代表不会自动验证,开发者手动进行验证(教程后期会讲)
OnloadValidation和ObjectOption枚举配合起来使用有不同的效果。
OnloadValidation有两个值:
None:界面显示后不进行验证
Required:界面显示后进行验证
ObjectOption也有两个值:
New:生成界面控件值为空。
Edit:生成界面控件会读取背后核心的属性值。
我们来看这样一个类型:
//+ using Mgen.Spa;
//+ using Mgen.Spa.Controls;
//+ using Mgen.Spa.Validators;
class MySpaType
{
[SpaHeader("Key1")]
[TextBoxStringControl]
[StringRequiredRule]
public string Text { get; set; }
public MySpaType()
{
Text = "Mgen";
}
}
这个类型只有一个属性Text,创建后值是”Mgen”,控件是文本框,验证器是要求不能为空的StringRequiredRule。
下面是OnloadValidation和ObjectOption的四种组合结果。
OnloadValidation.Required和ObjectOption.New - 数据为空且有验证错误:
OnloadValidation.Required和ObjectOption.Edit - 数据不为空没有验证错误:
OnloadValidation.None和ObjectOption.New - 数据为空不进行验证
OnloadValidation.None和ObjectOption.Edit - 数据不为空不进行验证
2. Spa对象
这一部分原来是在教程第2节讲界面生成和Hello World中的,不过考虑那时读者刚了解到界面生成,正在读Hello World代码,可能会影响读者理解一些简单概念。于是把它搬到了这里,此时,教程不知不觉已经到了第8部分了,读者已经对Spa工程非常了解了,那么强调一下这个Spa对象(SpaObject类型)的使用:
Spa对象(SpaObject类型)代表着生成界面对象的数据,是和一个数据对象是绑定的。比如在这段代码中:
var myObject = new MySpaType();
var opt = new SpaObjectOption(
new ValidationOption(
ValidationTrigger.PropertyChanged,
OnloadValidation.Required,
ObjectOption.Edit),
new DefaultResProvider(typeof(Res)),
Res.Title);
var spaObject = SpaManager.GetObject(myObject, opt);
new SpaWindow(spaObject).ShowDialog();
最后得到的Spa对象,也就是spaObject变量是紧紧得和数据对象(myObject变量)绑定的。
那么开发者可以只使用这一个Spa对象来多次创建SpaWindow从而多次对myObject进行编辑。(此过程不需要多次创建Spa对象)
但是开发者不可以同时把一个Spa对象显示在多个SpaWindow中。(这样做也是没有意义的)
另外,因为Spa对象代表绑定对象界面中的数据,因此如果开发者:
> 想改变对应数据界面的语言。
> 想对另一个对象进行界面生成。
那么必须对相应对象重新进行界面生成(再次调用SpaManager.GetObject方法)。
提示:
其实Spa对象就是MVVM编程模式的ViewModel。
最后,还是推荐开发者每次显示界面时都去生成一个Spa对象。