<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[EngraveSmile的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/EngraveSmile</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; EngraveSmile]]></copyright><item><title><![CDATA[在ItemsControl.DataTemplate中 ContextMenu 获取父DataContext]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/113315479</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/113315479</guid><author>EngraveSmile</author><pubDate>Thu, 28 Jan 2021 11:24:53 +0800</pubDate><description><![CDATA[根据http://www.voidcn.com/article/p-rtutndyr-bvo.html这篇文章给出的解决方案，我将完整的解决代码总结下来

方案1：WPF 4.0或更高版本

使用x：Reference标记扩展来与ItemsControl dataContext绑定，在ItemsControl上设置x：Name并使用绑定：


&lt;ItemsControl x:Name="itemsControl"&gt;
   ....
   &lt;MenuItem Command="{Bindin]]></description><category></category></item><item><title><![CDATA[EF6 SQLite CodeFirst]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/108213188</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/108213188</guid><author>EngraveSmile</author><pubDate>Tue, 25 Aug 2020 09:12:09 +0800</pubDate><description><![CDATA[前言：最近项目需要一个附带在程序里的一个小的数据库，在Access和SQLite之间选择了后者，由于用户的实际使用环境可能有Win7和Win10环境，所以选择了EF6而不是EFcore。

1.Nuget程序包需要引用下面这些


&lt;packages&gt;
  &lt;package id="EntityFramework" version="6.4.4" targetFramework="net45" /&gt;
  &lt;package id="SQLite.CodeFirst" versio]]></description><category></category></item><item><title><![CDATA[BitArray 类]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/106767051</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/106767051</guid><author>EngraveSmile</author><pubDate>Mon, 15 Jun 2020 17:19:24 +0800</pubDate><description><![CDATA[//
  // 摘要:
  //   Manages a compact array of bit values, which are represented as Booleans, where
  //   true indicates that the bit is on (1) and false indicates the bit is off (0).
  public sealed class BitArray : ICollection, IEnumerabl...]]></description><category></category></item><item><title><![CDATA[List<T>  泛型集合]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/105416443</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/105416443</guid><author>EngraveSmile</author><pubDate>Thu, 09 Apr 2020 18:00:58 +0800</pubDate><description><![CDATA[//
    // 摘要:
    //     Represents a strongly typed list of objects that can be accessed by index. Provides
    //     methods to search, sort, and manipulate lists.
    //
    // 类型参数:
    //  ...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（三十三） lambda 闭包]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/105095195</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/105095195</guid><author>EngraveSmile</author><pubDate>Wed, 25 Mar 2020 14:51:17 +0800</pubDate><description><![CDATA[闭包

通过Lambda表达式访问Lambda表达式块外部的变量，称为闭包。


        private static void Main()
        {
            // 闭包
            int val = 10;
            Func&lt;int,int&gt; action = (params1) =&gt;
            ...]]></description><category></category></item><item><title><![CDATA[ReferenceEquals 方法]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/104845397</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/104845397</guid><author>EngraveSmile</author><pubDate>Fri, 13 Mar 2020 17:26:45 +0800</pubDate><description><![CDATA[ReferenceEquals

ReferenceEquals 方法是Object类的静态方法，不能被改写。该方法可以比较两个引用类型的引用是否指向用一个实例。

特殊的情况是ReferenceEquals 比较两个NULL的时候，返回的结果是true


        //
        // 摘要:
        //     Determines whether the speci...]]></description><category></category></item><item><title><![CDATA[C# IList转DataTable]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/104656368</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/104656368</guid><author>EngraveSmile</author><pubDate>Wed, 04 Mar 2020 16:29:39 +0800</pubDate><description><![CDATA[public static DataTable IListToDataTable(IList list)
        {
            DataTable dataTable = new DataTable();
            if (list.Count &gt; 0)
            {
                PropertyInfo[] prope...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（三十二） Array类]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/104580292</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/104580292</guid><author>EngraveSmile</author><pubDate>Sat, 29 Feb 2020 19:48:33 +0800</pubDate><description><![CDATA[Array

用方括号声明数组是C#中使用Array类的表示法。在后台使用C＃语法，会创建一个派生自抽象基类Array的新类。这样数组就是可以使用Array定义的方法和属性。

Array是抽象类，所以不能使用构造函数实例化。除了使用C＃语法创建数组实例，还可以使用静态方法CreateInstance（）创建数组。


        private static void Main()
    ...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（三十一） 扩展方法]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/104228766</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/104228766</guid><author>EngraveSmile</author><pubDate>Sat, 08 Feb 2020 21:36:56 +0800</pubDate><description><![CDATA[扩展方法

扩展方法就是给对象添加功能的一种方式。

扩展方法可以扩展类，使之增加需要的方法；扩展方法也可以用于扩展接口。这样，实现该接口的所有类就有了公共功能。
扩展方法是静态方法，同时声明扩展方法的类也是静态类。扩展方法是扩展对象的一部分，但实际没有放在对象的原代码中。
扩展方法必须包含关键...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（三十） 方法]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/104202685</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/104202685</guid><author>EngraveSmile</author><pubDate>Thu, 06 Feb 2020 21:31:19 +0800</pubDate><description><![CDATA[方法的定义包括任意方法修饰符、返回值类型、输入参数列表和方法体。

方法不等同于函数，函数包含方法。




//方法体方法（需要花括号）        
private static void Main()        
{            
    Console.WriteLine("hello World!");        
}

//表达式体方法，仅限方法实现只有一个语句。...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十九） 常量const修饰符 只读readonly修饰符]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/103529200</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/103529200</guid><author>EngraveSmile</author><pubDate>Fri, 13 Dec 2019 16:50:17 +0800</pubDate><description><![CDATA[常量 const
常量是指变量在生命周期内值不会发生变化。常量可以修饰字段和局部变量。
常量必须在声明时初始化。赋值后就不能再被改写。
赋值给常量的值必须是常量，即确定的值，不能将变量赋值给常量。
常量总是隐式静态的，但是常量不能被static修饰。


    class Program
    {
        const int age = 1;//常量字段
        static ...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十八） 变量Field]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/103437566</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/103437566</guid><author>EngraveSmile</author><pubDate>Sat, 07 Dec 2019 17:33:51 +0800</pubDate><description><![CDATA[变量

变量是程序执行时储存在内存中的数据。

变量的种类有
  1.局部变量  在方法的作用域保存的临时数据
  2.字段     保存和类型或类型实例相关的数据
  3.参数     用于从一个方法到另一个方法传递数据的临时变量
  4.数组...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十七） 关键字VAR]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/103421053</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/103421053</guid><author>EngraveSmile</author><pubDate>Fri, 06 Dec 2019 13:17:47 +0800</pubDate><description><![CDATA[从C# 3开始，在方法范围内声明的变量可以具有隐式类型var。
隐式类型本地变量为强类型，编译器可以根据变量的初始化值推断出变量的类型。
例如 var i = 0; 和 int i = 0; 是等效的。

使用var的规则
  1.只能用于本地变量，而不能用于字段
  2.只能在变量声明中包含初始化时使用
  3.一旦编译器推断出变量的类型时，var就是固定的，且不可修改
 ...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十六）程序集(assembly)]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/103417628</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/103417628</guid><author>EngraveSmile</author><pubDate>Fri, 06 Dec 2019 10:17:57 +0800</pubDate><description><![CDATA[程序集(assembly)

   .NET程序的库和可执行文件称为程序集。程序集是包含编译好、面向.NET Framework的代码的逻辑单元。
   程序集是完全自描述的，它是一个逻辑单元而非物理单元，即它可以存在多个文件中。如果程序集存储在多个文件中，则会包含入口点的主文件，主文件描述了程序集中的其他文件。
   可执行代码和库代码使用相同的程序集结构。...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十五）LINQ]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/99999280</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/99999280</guid><author>EngraveSmile</author><pubDate>Wed, 21 Aug 2019 21:24:24 +0800</pubDate><description><![CDATA[LINQ

LINQ代表语言集成查询(Language Integrated Query)。
LINQ是.NET框架的扩展，它允许我们以数据库查询的方式查询数据集合。
使用LINQ可以从数据库、程序对象以及XML文档中查询数据。

1.LINQ提供程序
对于每种数据源类型，回应根据其类型实现LINQ查询的代码模块，这些模块被叫做LINQ提供程序。

2.查询语法和方法语法
有两种形式的语法可以在写...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十四）迭代器]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/95495814</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/95495814</guid><author>EngraveSmile</author><pubDate>Mon, 15 Jul 2019 17:33:59 +0800</pubDate><description><![CDATA[迭代器
迭代器是自动生成可枚举类型和枚举数的结构。

1.迭代器块
迭代器块是有一个或多个yield语句的代码块。
方法主体、访问器主体、运算符主体都可以是迭代器块。
迭代器块不需要同一时间内执行一序列的命令式语句，而是描述编译器创建枚举数类的行为。
yield return 语句执行了序列中返回的下一项。
yield break 语句指定在序列中没有更多项。

2.使用迭代器创建枚举数


  ...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十三）枚举数和可枚举类型]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/95202113</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/95202113</guid><author>EngraveSmile</author><pubDate>Wed, 10 Jul 2019 15:26:14 +0800</pubDate><description><![CDATA[IEnumerator接口
  IEnumerator接口包含3个函数成员：Current、MoveNext以及Reset

Current返回序列中当前位置项的属性。
  它是只读属性。
  它返回object类型的引用，所以可以返回任何类型。

MoveNext是把枚举数位置前进到集合中下一项的方法。
  如果有新的位置是有效的，方法返回true。
  如果新的位置是无效的...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十二）泛型]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/94631180</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/94631180</guid><author>EngraveSmile</author><pubDate>Fri, 05 Jul 2019 17:02:02 +0800</pubDate><description><![CDATA[泛型

1.泛型类
声明泛型类时在类名之后放置一组尖括号。
在尖括号中用逗号分隔的占位字符串来表示希望提供的类型，这被叫做类型参数。
在泛型类声明的主体中使用类型参数来表示应该被替代的类型。


    class A &lt;T1,T2&gt;
    {
        public T1 ParamA { get; set; }
        public T2 ParamB { get;...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十一）转换]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/94349402</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/94349402</guid><author>EngraveSmile</author><pubDate>Sun, 30 Jun 2019 19:01:07 +0800</pubDate><description><![CDATA[转换
转换时接受一个类型的值并使它作为另一个类型的等价值的过程。

1.隐式转换
有些类型的转换不会丢失数据或精度，语言自动做这些转换的叫做隐式转换。
从位数更少的源转换为位数更多的目标类型时，目标中多出来的位需要用0或1填充。
当从更小的无符号类型转换为更大的无符号类型时，目标类型多出来的最高位都以0进行填充，这叫做零扩展。
对于有符号类型的转换，需要用额外的高位用源表达式的符号位进行填充，这样...]]></description><category></category></item><item><title><![CDATA[C#学习笔记（二十）接口]]></title><link>https://blog.youkuaiyun.com/EngraveSmile/article/details/94334234</link><guid>https://blog.youkuaiyun.com/EngraveSmile/article/details/94334234</guid><author>EngraveSmile</author><pubDate>Sun, 30 Jun 2019 16:41:35 +0800</pubDate><description><![CDATA[接口

1.定义
接口是表示一组函数成员而不实现成员的引用类型。
类和结构可以实现接口。

2.声明接口
接口声明不能包含数据成员。
接口声明只能包含方法、属性、事件、索引得静态成员函数的声明。
函数成员声明不能包含实现代码，且成员声明的主题必须使用分号。
接口声明可以分隔成分布接口声明。
接口声明可以有任何的访问修饰符public、protected、internal或private
接口成员是...]]></description><category></category></item></channel></rss>