zoukankan      html  css  js  c++  java
  • XAML语法学习之...

    决定深入学习下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,程序运行没有问题。

  • 相关阅读:
    mysql的备份与恢复(windows、Linux并拷贝至备机)
    eclipse导出可执行jar
    ORCLE中两张表对比更新合入(MERGE INTO)
    js中事件冒泡的问题
    Spring事务传播行为详解
    Java中的锁分类与使用
    用某浏览器全屏延时启动应用
    Springboot整合WebSocket的交互实例(点对点、点对面)
    Windows程序设计------字体不等宽引出的问题及其细节知识
    关于VS2013使用constexpr报错问题
  • 原文地址:https://www.cnblogs.com/HelloMyWorld/p/2890848.html
Copyright © 2011-2022 走看看