决定深入学习下XAML,现在感觉所学的东西都是很零散,没有自己的东西
使用Attribute=Value语法赋值,由于XAML的语法限制,Value只可能是一个字符串。这就引出2个问题
- 如果一个类能使用XAML语言进行申明,并允许它的Property与XAML标签的Attribute互相映射,那就需要为这些Property准备适当的转换机制
- 由于Value是一个字符串,所以其格式复杂程度有限,尽管可以再转换机制里包含一定的按格式解析字符串的功能,但这会让最终的XAML使用者头疼不已。因为他们不得不在没有编码辅助的情况下手写一个格式复杂的字符串以满足赋值要求。
第一个问题的解决方案是使用TypeConverter类的派生类,在派生类重写TypeConverter的一些方法,第二个问题的解决方案就是使用属性元素。
首先我们准备了一个类
public class Human { public string Name { get; set; } public Human Child { get; set; } }
现在我们的期望是在XAML中这样写
<Window.Resources> <local:Human x:Key="human" Child="ABC"></local:Human> </Window.Resources>
就能得到child对象,并且Name=“ABC”,加个按钮将其结果显示出来,运行,发现错误。程序根本不知道如何把ABC付给一个新的Human。
那我们应该怎么做?办法是使用TypeConverter。
首先得从TypeConveter派生自己的类,需要引用程序集System.ComponentModel;
class StringToHumanTypeConverter : TypeConverter { public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { Human h = new Human(); h.Name = value as string; return h; } return base.ConvertFrom(context, culture, value); } }
然后再把该特征引用到Human类上
[TypeConverter(typeof(StringToHumanTypeConverter))] public class Human { public string Name { get; set; } public Human Child { get; set; } }
Ok,程序运行没有问题。