<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_享受代码,享受人生</title><subtitle type="text">SOA is anintegration solution.    SOA is message oriented first.The Key character of SOA is loosely coupled. SOA is enriched by creating composite apps.</subtitle><id>http://feed.cnblogs.com/blog/u/1709/rss</id><updated>2012-02-27T08:29:54Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/1709/rss"/><entry><id>http://www.cnblogs.com/idior/archive/2010/06/23/1763924.html</id><title type="text">Resume</title><summary type="text">Summary Ning Xu is the architect manager of PFS group in State Street Technology (Zhejiang). Mr. Xu is responsible for implementing the architecture design of new system with the help of PFS team in Princeton. He has worked in Princeton for four months with onsite architecture team. In last 5 year..</summary><published>2010-06-23T12:10:00Z</published><updated>2010-06-23T12:10:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/06/23/1763924.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/06/23/1763924.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ning Xu is the architect manager of PFS group in State Street Technology (Zhejiang). Mr. Xu is responsible for implementing the architecture design of new system with the help of PFS team in Princeton. He has worked in Princeton for four months with onsite architecture team. &lt;/p&gt;&lt;p&gt;&lt;div&gt;  &lt;p&gt;In last 5 years, Mr. Xu was involved in one financial product development as an offshore architect manager to work with the product management team, development team and UAT team in State Street Technology (Zhejiang).&amp;nbsp; He is leading an architect team which contains of 20 developers in china, while the whole development team contains of nearly 100 developers. He has travelled to Germany with 10 Chinese developers in order to set up a development team in China in 2011.&amp;nbsp; He was named&amp;nbsp; "Employee of the Year " in 2009 in his company. He was promoted as officer(Bank title) in 2011. &lt;br /&gt;&lt;/p&gt;  &lt;/div&gt;&lt;/p&gt;&lt;p&gt;Ning Xu has 6 years experiences on C#/.Net technology, he has translated two popular books &amp;#8220;Practical .NET 2 and C# 2&amp;#8221; and&amp;nbsp; &amp;#8220;Programming WCF&amp;#8221;, and he has been recognized as a Microsoft Most Valuable Professional in C #area in 07/2007. He also has a very good understanding and a lot of experiences on object-oriented design and design pattern. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Professional Experience&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;State Street Technology (Zhejiang), Hangzhou &lt;strong&gt; &lt;/strong&gt;2007/05 - Present &lt;/p&gt;&lt;p&gt;State Street Technology (Zhejiang) is the wholly owned subsidiary of State Street and the global development center for State Street worldwide. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Project experience&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;WPF based C/S accounting system&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;This project is a C/S system which migrated from an old MFC application. The old application contains millions of lines of codes which is apparently a huge system. The core business is written in native C++ code, our job is to reuse those codes as much as we can, but build a fantasy GUI with the new technology. This project is divided into two parts like others, frontend and backend. The backend is hosted as WCF service; internally we use C++/CLI to make a wrapper layer in order to reuse the existing codes. The latest GUI technology WPF is used for building the frontend in order to get the best user experience. MVVM pattern is heavily used in this project, which makes the whole system more testable. &lt;/p&gt;&lt;p&gt;I mainly worked on frontend architecture which includes implementing the core architecture for the input screen; meantime, I also managed the whole team to deliver all kinds of reusable controls, patterns for building particular screens, resolve common issues and improve the performance of the whole system.  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Community&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Translator of &amp;#8220;Programming WCF&amp;#8221; &lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;a href="http://www.china-pub.com/38123" target="_blank"&gt;http://www.china-pub.com/38123&lt;/a&gt;&lt;/u&gt; &lt;/p&gt;&lt;p&gt;Translator of &amp;#8220;Practical&amp;nbsp; .NET 2 and C# 2&amp;#8221; &lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;a href="http://www.turingbook.com/Books/ShowBook-218.aspx" target="_blank"&gt;http://www.turingbook.com/Books/ShowBook-218.aspx&lt;/a&gt;&lt;/u&gt; &lt;/p&gt;&lt;p&gt;Microsoft Most Valuable Professional in C# area in 07/2007. &lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;a href="http://www.microsoft.com/china/community/Professional/MVP/MVPListMain.mspx" target="_blank"&gt;http://www.microsoft.com/china/community/Professional/MVP/MVPListMain.mspx&lt;/a&gt;&lt;/u&gt; &lt;/p&gt;&lt;p&gt;Blog &lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;a href="http://idior.cnblogs.com/" target="_blank"&gt;http://idior.cnblogs.com&lt;/a&gt;&lt;/u&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Skill certificate&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;CET4 CET6 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Education&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Southeast University, Nanjing, China&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2004/09 &amp;#8211; 2007/05 &lt;/p&gt;&lt;p&gt;Master in Computer Science &lt;/p&gt;&lt;p&gt;Southeast University, Nanjing, China&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2000/09 &amp;#8211; 2004/07 &lt;/p&gt;&lt;p&gt;Bachelor in Computer Science&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idior/aggbug/1763924.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idior/archive/2010/06/23/1763924.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/06/20/1761383.html</id><title type="text">Covariance and Contravariance</title><summary type="text">协变和逆变，这两个词的翻译实在很难表达出他们的真实含义。其实他们是继承和多态的衍生物，而且在.Net 1.0 和2.0中都提供了某种程度的支持，只是在.Net 4.0中支持的更加完善了。 简单说来，协变和逆变就是希望支持更多情况的隐式类型转换,使得我们的编程更加方便，而通常来说只有具备继承关系的两个对象才可以发生隐式类型转换，如Base b=new Derived(). 协变和逆变则使得更多的类...</summary><published>2010-06-20T06:36:00Z</published><updated>2010-06-20T06:36:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/06/20/1761383.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/06/20/1761383.html"/><content type="html">&lt;p&gt;协变和逆变，这两个词的翻译实在很难表达出他们的真实含义。其实他们是继承和多态的衍生物，而且在.Net 1.0 和2.0中都提供了某种程度的支持，只是在.Net 4.0中支持的更加完善了。 &lt;/p&gt; &lt;p&gt;简单说来，协变和逆变就是希望支持更多情况的隐式类型转换,使得我们的编程更加方便，而通常来说只有具备继承关系的两个对象才可以发生隐式类型转换，如Base b=new Derived(). 协变和逆变则使得更多的类型之间可以发生隐式类型转换，如通过协变以下代码可以正常工作：&lt;/p&gt;&lt;span style="color: #2b91af"&gt;           Func&lt;/span&gt;&amp;lt;Derived&amp;gt; dFunc=GetDFunc();&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;Base&amp;gt; bFunc = dFunc;&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;Derived&amp;gt; dEnum=GetDEnum();&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;Base&amp;gt; bEnum = dEnum;&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;那么我们为什么需要这种功能呢？让我们从一个多态的例子开始：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;     abstract class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Animal&lt;br/&gt;     &lt;/span&gt;{&lt;br/&gt;         &lt;span style="color: blue"&gt;internal abstract void &lt;/span&gt;Eat();&lt;br/&gt;     }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;     &lt;span style="color: blue"&gt;abstract class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Mammal &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Animal&lt;br/&gt;     &lt;/span&gt;{&lt;br/&gt;     }&lt;br/&gt;&lt;br/&gt;     &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tiger &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Mammal&lt;br/&gt;     &lt;/span&gt;{&lt;br/&gt;         &lt;span style="color: blue"&gt;internal override void &lt;/span&gt;Eat()&lt;br/&gt;         {&lt;br/&gt;             &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Tiger eat"&lt;/span&gt;);&lt;br/&gt;         }&lt;br/&gt;     }&lt;br/&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Tiger &lt;/span&gt;tiger = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;();&lt;br/&gt;        FeedAnimal(tiger);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;static void &lt;/span&gt;FeedAnimal(&lt;span style="color: #2b91af"&gt;Animal &lt;/span&gt;animal)&lt;br/&gt;    {&lt;br/&gt;        animal.Eat();&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;虽然FeedAnimal方法接受的参数类型为&lt;span style="color: #2b91af"&gt;Animal &lt;/span&gt;,但是当我们传入一个&lt;span style="color: #2b91af"&gt;Tiger &lt;/span&gt;的实例，方法能够编译通过，并得到正确的执行。这是一个典型的多态运用。之所以能够这么做是因为&lt;span style="color: #2b91af"&gt;Tiger &lt;/span&gt;继承于&lt;span style="color: #2b91af"&gt;Animal &lt;/span&gt;，在FeedAnimal方法中对&lt;span style="color: #2b91af"&gt;Animal&lt;/span&gt;对象的各种操作，&lt;span style="color: #2b91af"&gt;Tiger &lt;/span&gt;对象同样支持，而不会发生调用了animal的某个方法A，而tiger中不存在A方法的情况。 那么如果我们把这一原则推而广之，就出现了协变这一概念。&lt;/p&gt;&lt;span style="color: blue"&gt;       static void &lt;/span&gt;FeedAnimal(&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Animal&lt;/span&gt;&amp;gt; animalCreator)&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;var &lt;/span&gt;animal=animalCreator();&lt;br/&gt;           animal.Eat();&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: blue"&gt;static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tiger &lt;/span&gt;CreateTiger()&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;();&lt;br/&gt;       }&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;现在我们让FeedAnimal方法接受一个能够返回Animla的delegate，而同时又创建了一个能够返回Tiger的方法。按照之前的推理，FeedAnimal方法无非就是对delegate中返回的Animal对象进行各种操作，那么如果给它一个返回Tiger对象的delegate，也应该能够正常的工作。所以下面这段代码是可以在.NET 2.0中工作的。&lt;/p&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;br/&gt;    {&lt;br/&gt;        FeedAnimal(CreateTiger);&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;这就是所谓的协变，我们希望两个对象之间，除了继承关系外也能做隐式类型的转换，因为我们认为这种转换是合理的，是类型安全的。&lt;/p&gt;&lt;p&gt;大家可能很奇怪，如果.Net 2.0就已经支持了以上的代码，那么4.0又搞了些什么？&lt;/p&gt;&lt;p&gt;先来看看下面的代码:&lt;/p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Tiger &lt;/span&gt;tiger = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;();&lt;br/&gt;        FeedAnimal(tiger);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;static void &lt;/span&gt;FeedAnimal(&lt;span style="color: #2b91af"&gt;Animal &lt;/span&gt;animal)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Feed Animal"&lt;/span&gt;);        }&amp;nbsp;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;static void &lt;/span&gt;FeedAnimal(&lt;span style="color: #2b91af"&gt;Mammal &lt;/span&gt;mammal)    {        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Feed Mamal"&lt;/span&gt;);      } &lt;br/&gt;}&amp;nbsp;&lt;p&gt;以上这段代码的输出结果是 Feed Mammal，当碰到两个匹配的重载方法时，.Net编译器选择了形参类型在继承树上更接近自己的方法。可是如果我们把Animal改成Func&amp;lt;Animal&amp;gt; 以下代码就编译出错了，编辑器不知道选择哪个方法作为匹配。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;br/&gt;    {&lt;br/&gt;        FeedAnimal(CreateTiger);&lt;br/&gt;    }    &lt;span style="color: blue"&gt;static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tiger &lt;/span&gt;CreateTiger() { &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;(); } &lt;br/&gt;  &lt;span style="color: blue"&gt;    static void &lt;/span&gt;FeedAnimal(&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Animal&lt;/span&gt;&amp;gt; animalCreator)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: blue"&gt;var &lt;/span&gt;animal=animalCreator();&lt;br/&gt;        animal.Eat();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span style="color: blue"&gt;static void &lt;/span&gt;FeedAnimal(&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Mammal&lt;/span&gt;&amp;gt; animalCreator)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: blue"&gt;var &lt;/span&gt;animal = animalCreator();&lt;br/&gt;        animal.Eat();&lt;br/&gt;    }&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;究其根本，在C# 2.0中你无法实现以下delegate间的隐式类型转换 &lt;/p&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;&amp;gt; tFunc = CreateTiger;&lt;br/&gt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Animal&lt;/span&gt;&amp;gt; aFunc = tFunc;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;而C# 4.0, 使得上述代码能够成功运行，之前的两个方法他也能够做出正确的选择。这是通过out关键字实现的。 注意Func&amp;lt;TResult&amp;gt; 这个delegate在C# 2.0和4.0中的定义是不同的：&lt;/p&gt;&lt;span style="color: green"&gt;     //C# 2.0&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: blue"&gt;public delegate &lt;/span&gt;TResult &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;TResult&amp;gt;();&lt;br/&gt;&lt;br/&gt;     &lt;span style="color: green"&gt;//C# 4.0&lt;br/&gt;     &lt;/span&gt;&lt;span style="color: blue"&gt;public delegate &lt;/span&gt;TResult &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;out &lt;/span&gt;TResult&amp;gt;();&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;out关键字表示该类型用于返回值，而返回值可以发生协变，因为一个方法如果能够接受一个返回Animal的delegate，那么他必然也可以接受一个返回Tiger的delegate，因为他对animla的操作同样可以作用于tiger上。&lt;/p&gt;&lt;p&gt;既然delegate能够支持协变，那么interface也应该给予支持，因为它无非就是多个delegate罢了。&lt;/p&gt;&lt;p&gt;以下代码在C# 2.0中式不能通过编译的, 这样看来interface还不如delegate支持的好。&lt;/p&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;&amp;gt; tigers = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;&amp;gt;();&lt;br/&gt;    FeedAnimals(tigers);          &lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;span style="color: blue"&gt;static void &lt;/span&gt;FeedAnimals(&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Animal&lt;/span&gt;&amp;gt; animals)&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;animal &lt;span style="color: blue"&gt;in &lt;/span&gt;animals)&lt;br/&gt;        animal.Eat();&lt;br/&gt;}&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;下面的代码也就更加不行了：&lt;/p&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;&amp;gt; tigers = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Animal&lt;/span&gt;&amp;gt; animlas = tigers;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;到了C# 4.0中，由于out关键字的缘故，以上两段代码都能正常工作了。而IEnumerable&amp;lt;T&amp;gt;的定义也被改为&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;     public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;out &lt;/span&gt;T&amp;gt; : IEnumerable&lt;br/&gt;     {                     &lt;br/&gt;         &lt;span style="color: #2b91af"&gt;IEnumerator&lt;/span&gt;&amp;lt;T&amp;gt; GetEnumerator();&lt;br/&gt;     }&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;之前举得例子都是描述协变的，其实逆变无非就是扩大了输入参数的类型转换的可能，不过方向是反的。&lt;/p&gt;&lt;span style="color: blue"&gt;  static void &lt;/span&gt;FeedAnimal(&lt;span style="color: #2b91af"&gt;Animal &lt;/span&gt;animal)&lt;br/&gt;  {&lt;br/&gt;      animal.Eat();&lt;br/&gt;  }&lt;br/&gt;&lt;br/&gt;  &lt;span style="color: blue"&gt;static void &lt;/span&gt;Execute(&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Mammal&lt;/span&gt;&amp;gt; tAct)&lt;br/&gt;  {&lt;br/&gt;      tAct(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Tiger&lt;/span&gt;());&lt;br/&gt;  }&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在Execute方法中， 我们接受一个类型为&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Mammal&lt;/span&gt;&amp;gt; 的delegate，我们在使用这个delegate时，可以传入各种类型的Mammal，比如Tiger， Lion。如果我们传入的delegate能够作用于Animal对象，那么他自然可以作用于Tiger， Lion。 所以我们可以传入一个输入类型更抽象的delegate。因此，在逆变的支持下我们可以写出以下代码。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;      static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)&lt;br/&gt;      {&lt;br/&gt;          &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Animal&lt;/span&gt;&amp;gt; aAct = FeedAnimal;&lt;br/&gt;          &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Mammal&lt;/span&gt;&amp;gt; mAct = aAct;&lt;br/&gt;          &lt;br/&gt;          Execute(aAct);&lt;br/&gt;      }&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;参考资料：&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/" target="_blank"&gt;eric's&amp;nbsp;series on covariance and contravariance&amp;nbsp;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idior/aggbug/1761383.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idior/archive/2010/06/20/1761383.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/06/14/1758232.html</id><title type="text">How does ElementName Binding work?</title><summary type="text">How does ElementName Binding work? - Part 1 Logical Tree &amp; NameScopeHow does ElementName Binding work – Part 2 BindingExpressionHow does ElementName Binding work – Part 3 InheritanceCo...</summary><published>2010-06-14T06:49:00Z</published><updated>2010-06-14T06:49:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/06/14/1758232.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/06/14/1758232.html"/><content type="html">&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; line-height: normal; font-size: 13px; color: #444444; "&gt;&lt;h2 style="margin-top: 0px; font-size: 12px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a id="ctl03_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/idior/archive/2010/05/28/1746513.html" style="color: #223355; text-decoration: none; " target="_blank"&gt;How does ElementName Binding work? - Part 1 Logical Tree &amp;amp; NameScope&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; line-height: normal; font-size: 13px; color: #444444; "&gt;&lt;h2 style="margin-top: 0px; font-size: 12px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a id="ctl03_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/idior/archive/2010/06/07/1753452.html" style="color: #223355; text-decoration: none; " target="_blank"&gt;How does ElementName Binding work &amp;#8211; Part 2 BindingExpression&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; line-height: normal; font-size: 13px; color: #444444; "&gt;&lt;h2 style="margin-top: 0px; font-size: 12px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a id="ctl03_TitleUrl" class="singleposttitle" href="http://www.cnblogs.com/idior/archive/2010/06/12/1757151.html" style="color: #223355; text-decoration: none; " target="_blank"&gt;How does ElementName Binding work &amp;#8211; Part 3 InheritanceContext&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idior/aggbug/1758232.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idior/archive/2010/06/14/1758232.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/06/13/1757974.html</id><title type="text">Weird behavior of DataContext Inheritance</title><summary type="text">Actually there are several questions in this post, though all of them are about DataContext inheritance. I think you will have have fun with these questions, if anyone can explain what's going on here...</summary><published>2010-06-13T12:16:00Z</published><updated>2010-06-13T12:16:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/06/13/1757974.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/06/13/1757974.html"/><content type="html">&lt;p&gt;Actually there are several questions in this post, though all of them are about DataContext inheritance. I think you will have have fun with these questions, if anyone can explain what's going on here, it will be greatly appreciated, however it's really not that easy to answer.  &lt;/p&gt;&lt;p&gt;I created a CustomControl which derives from ContentControl by adding a Gutter property, so that the user of this control can specify two part of this control Content and Gutter. Here is my codes:&lt;/p&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BizField &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ContentControl&lt;br/&gt;   &lt;/span&gt;{&lt;br/&gt;       &lt;span style="color: blue"&gt;static &lt;/span&gt;BizField()&lt;br/&gt;       {&lt;br/&gt;           DefaultStyleKeyProperty.OverrideMetadata(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BizField&lt;/span&gt;), &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FrameworkPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BizField&lt;/span&gt;)));&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: blue"&gt;public object &lt;/span&gt;Gutter&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt;)GetValue(GutterProperty); }&lt;br/&gt;           &lt;span style="color: blue"&gt;set &lt;/span&gt;{ SetValue(GutterProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: green"&gt;// Using a DependencyProperty as the backing store for Gutter.  This enables animation, styling, binding, etc...&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;GutterProperty =&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"Gutter"&lt;/span&gt;,&lt;br/&gt;                           &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt;), &lt;br/&gt;                           &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BizField&lt;/span&gt;), &lt;br/&gt;                           &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;null&lt;/span&gt;,&lt;br/&gt;                               &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyChangedCallback&lt;/span&gt;(OnGutterChanged)));&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: blue"&gt;private static void &lt;/span&gt;OnGutterChanged(&lt;span style="color: #2b91af"&gt;DependencyObject &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs &lt;/span&gt;e)&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;var &lt;/span&gt;me = sender &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BizField&lt;/span&gt;;&lt;br/&gt;           me.OnGutterChanged(e);&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: blue"&gt;private void &lt;/span&gt;OnGutterChanged(&lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs &lt;/span&gt;e)&lt;br/&gt;       {&lt;br/&gt;         &lt;br/&gt;       }&lt;br/&gt;   }&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;The template is quite simple: &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Style &lt;/span&gt;&lt;span style="color: red"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Type &lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;BizField&lt;/span&gt;&lt;span style="color: blue"&gt;}"&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter &lt;/span&gt;&lt;span style="color: red"&gt;Property&lt;/span&gt;&lt;span style="color: blue"&gt;="Template"&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ControlTemplate &lt;/span&gt;&lt;span style="color: red"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Type &lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;BizField&lt;/span&gt;&lt;span style="color: blue"&gt;}"&amp;gt;&lt;br/&gt;                    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Border &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;TemplateBinding &lt;/span&gt;&lt;span style="color: red"&gt;Background&lt;/span&gt;&lt;span style="color: blue"&gt;}"&lt;br/&gt;                            &lt;/span&gt;&lt;span style="color: red"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;TemplateBinding &lt;/span&gt;&lt;span style="color: red"&gt;BorderBrush&lt;/span&gt;&lt;span style="color: blue"&gt;}"&lt;br/&gt;                            &lt;/span&gt;&lt;span style="color: red"&gt;BorderThickness&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;TemplateBinding &lt;/span&gt;&lt;span style="color: red"&gt;BorderThickness&lt;/span&gt;&lt;span style="color: blue"&gt;}"&amp;gt;&lt;br/&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentPresenter&lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br/&gt;                            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentPresenter &lt;/span&gt;&lt;span style="color: red"&gt;ContentSource&lt;/span&gt;&lt;span style="color: blue"&gt;="Gutter"/&amp;gt;&lt;br/&gt;                        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Border&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Style&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;Now if I use it in the main window, it works as expected: &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="DataContexPropagate.MainWindow"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;="clr-namespace:DataContexPropagate"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;="MainWindow" &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;="350" &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;="525"&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Click one"/&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField.Gutter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;}"/&amp;gt;&lt;br/&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField.Gutter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainWindow &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Window&lt;br/&gt;  &lt;/span&gt;{&lt;br/&gt;      &lt;span style="color: blue"&gt;public &lt;/span&gt;MainWindow()&lt;br/&gt;      {&lt;br/&gt;          &lt;span style="color: green"&gt;//Notice DataContext is set before parsing the baml&lt;br/&gt;          &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.DataContext = &lt;span style="color: #a31515"&gt;"Hello"&lt;/span&gt;;       &lt;br/&gt;          InitializeComponent();&lt;br/&gt;         &lt;br/&gt;      }&lt;br/&gt;  }&lt;br/&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The button defined in the Gutter shows&amp;nbsp; "Hello". Now I try to add the gutter as BizField's logical child.&lt;/p&gt;&lt;span style="color: blue"&gt;    private void &lt;/span&gt;OnGutterChanged(&lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs &lt;/span&gt;e)&lt;br/&gt;   {&lt;br/&gt;      &lt;span style="color: blue"&gt;this&lt;/span&gt;.AddLogicalChild(Gutter);&lt;br/&gt;   }&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;It still works fine, but if I set the DataContext after loading xaml, it will broke.&lt;/p&gt;&lt;span style="color: blue"&gt;public partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainWindow &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Window&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;public &lt;/span&gt;MainWindow()&lt;br/&gt;    {             &lt;br/&gt;        InitializeComponent();&lt;br/&gt;        &lt;span style="color: green"&gt;//Set datacontext after parsing baml&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.DataContext = &lt;span style="color: #a31515"&gt;"Hello"&lt;/span&gt;;&lt;br/&gt;       &lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;If you run the application, the button show nothing, apparently DataContext Inheritance doesn&amp;#8217;t work properly now. But if i change the button to a TextBlock, it will work. What&amp;#8217;s the magic with TextBlock? &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="DataContexPropagate.MainWindow"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;="clr-namespace:DataContexPropagate"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;="MainWindow" &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;="350" &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;="525"&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Click one"/&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField.Gutter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;}"/&amp;gt;&lt;br/&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField.Gutter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;To make the databinding works for the button, i have to add following codes to BizControl. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;protected override &lt;/span&gt;System.Collections.IEnumerator LogicalChildren&lt;br/&gt;     {&lt;br/&gt;         &lt;span style="color: blue"&gt;get&lt;br/&gt;         &lt;/span&gt;{&lt;br/&gt;             &lt;span style="color: blue"&gt;yield return &lt;/span&gt;Content;&lt;br/&gt;             &lt;span style="color: blue"&gt;yield return &lt;/span&gt;Gutter;&lt;br/&gt;         }&lt;br/&gt;     }&lt;br/&gt;&lt;p&gt;According to this example, you will find that "setting datacontext before or after parsing Baml does matter".&amp;nbsp; But i don't why and more intersting what happened to the TextBlock? &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Full source codes for BizField:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BizField &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ContentControl&lt;br/&gt;   &lt;/span&gt;{&lt;br/&gt;       &lt;span style="color: blue"&gt;static &lt;/span&gt;BizField()&lt;br/&gt;       {&lt;br/&gt;           DefaultStyleKeyProperty.OverrideMetadata(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BizField&lt;/span&gt;), &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FrameworkPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BizField&lt;/span&gt;)));&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: blue"&gt;public object &lt;/span&gt;Gutter&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt;)GetValue(GutterProperty); }&lt;br/&gt;           &lt;span style="color: blue"&gt;set &lt;/span&gt;{ SetValue(GutterProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: green"&gt;// Using a DependencyProperty as the backing store for Gutter.  This enables animation, styling, binding, etc...&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;GutterProperty =&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"Gutter"&lt;/span&gt;,&lt;br/&gt;                           &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt;),&lt;br/&gt;                           &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;BizField&lt;/span&gt;),&lt;br/&gt;                           &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;null&lt;/span&gt;,&lt;br/&gt;                               &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PropertyChangedCallback&lt;/span&gt;(OnGutterChanged)));&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: blue"&gt;private static void &lt;/span&gt;OnGutterChanged(&lt;span style="color: #2b91af"&gt;DependencyObject &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs &lt;/span&gt;e)&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;var &lt;/span&gt;me = sender &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;BizField&lt;/span&gt;;&lt;br/&gt;           me.OnGutterChanged(e);&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: blue"&gt;private void &lt;/span&gt;OnGutterChanged(&lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs &lt;/span&gt;e)&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: green"&gt;//Comment this out, it will search for the visual parent.&lt;br/&gt;           &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.AddLogicalChild(Gutter);&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: green"&gt;//Only by adding this method, it can work properly.&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;protected override &lt;/span&gt;System.Collections.&lt;span style="color: #2b91af"&gt;IEnumerator &lt;/span&gt;LogicalChildren&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;get&lt;br/&gt;           &lt;/span&gt;{&lt;br/&gt;               &lt;span style="color: blue"&gt;yield return &lt;/span&gt;Content;&lt;br/&gt;               &lt;span style="color: blue"&gt;yield return &lt;/span&gt;Gutter;&lt;br/&gt;           }&lt;br/&gt;       }&lt;br/&gt;   }&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="DataContexPropagate.MainWindow"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;="clr-namespace:DataContexPropagate"&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;="MainWindow" &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;="350" &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;="525"&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Click one"/&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField.Gutter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;}"/&amp;gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: green"&gt;&amp;lt;!--&amp;lt;TextBlock Text="{Binding}"/&amp;gt;--&amp;gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField.Gutter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;BizField&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Grid&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;public partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MainWindow &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Window&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: blue"&gt;public &lt;/span&gt;MainWindow()&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color: green"&gt;//Notice DataContext is set before parsing the baml&lt;br/&gt;        //this.DataContext = "Hello";        &lt;br/&gt;        &lt;/span&gt;InitializeComponent();&lt;br/&gt;        &lt;span style="color: green"&gt;//Set datacontext after parsing baml&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.DataContext = &lt;span style="color: #a31515"&gt;"Hello"&lt;/span&gt;;&lt;br/&gt;       &lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;img src="http://www.cnblogs.com/idior/aggbug/1757974.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idior/archive/2010/06/13/1757974.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/06/12/1757151.html</id><title type="text">How does ElementName Binding work – Part 3 InheritanceContext</title><summary type="text">In this part, I am going to introduce a new concept called InheritanceContext. In WPF, there are some elements are not FrameworkElement or even Visual, which means they will not be shown on either Log...</summary><published>2010-06-12T07:19:00Z</published><updated>2010-06-12T07:19:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/06/12/1757151.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/06/12/1757151.html"/><content type="html">&lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: #a31515"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;In this part, I am going to introduce a new concept called InheritanceContext. In WPF, there are some elements are not FrameworkElement or even Visual, which means they will not be shown on either Logical Tree or Visual Tree, e.g. Brush, however we still wish they can enjoy the feature called &amp;#8220;property value inheritance&amp;#8221;. Property value inheritance enables child elements to obtain the value of a particular property from parent elements, inheriting that value as it was set anywhere in the nearest parent element.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;In following example, the Brush can get the DataContext property from its parent, however a Brush is neither a FramewrokElement nor Visual.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="TestElementBindingInUserControl.MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel &lt;/span&gt;&lt;span style="color: red"&gt;DataContext&lt;/span&gt;&lt;span style="color: blue"&gt;="Red"&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;="75" &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;="75"&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle.Fill&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SolidColorBrush &lt;/span&gt;&lt;span style="color: red"&gt;Color&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;}" /&amp;gt;&lt;br/&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle.Fill&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;In this example, Brush doesn&amp;#8217;t have a logical parent nor visual parent, so how does it get the DataContext property from its parent? The secret is in InheritanceContext. &lt;strong&gt;Brush is a Freezable object whose InheritanceContext property is set to the element which contains it.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Here is the Rectangle, while Rectangle inherits the DataContext property from its Logical Parent StatckPanel.&lt;/p&gt;&lt;p&gt;With the help of InheritanceContext, the ElementName Binding will work properly in following codes:&lt;/p&gt;&amp;nbsp;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="TestElementBindingInUserControl.MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="Blue" &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="btn"/&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle &lt;/span&gt;&lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;="75" &lt;/span&gt;&lt;span style="color: red"&gt;Height&lt;/span&gt;&lt;span style="color: blue"&gt;="75"&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle.Fill&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SolidColorBrush &lt;/span&gt;&lt;span style="color: red"&gt;Color&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=btn, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Content}" /&amp;gt;&lt;br/&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle.Fill&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Rectangle&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;Although SolidColorBrush doesn&amp;#8217;t have a Logical parent, it will try to get its InheritanceContext instead, by which it will reach the Rectangle, then follow by the logical parent, we will find the Window which owns a NameScope; Finally btn will be found in this NameScope.&lt;/p&gt;&lt;p&gt;Now let&amp;#8217;s take a look at a popular issue in WPF development:&lt;strong&gt; use ElementName in ToolTip or ContextMenu.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="TestElementBindingInUserControl.MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;="MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="win"&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button.ToolTip&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox &lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="tbx"&lt;/span&gt; &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=win, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Title}"/&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button.ToolTip&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;The content defined in the a ToolTip is not part of Logical tree or Visual tree, it&amp;#8217;s not a Freezable object either. Then how can we use ElementName binding in the content?&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A straightforward solution comes into my mind is to do some hack to set the InheritanceContext property of TextBox to the Window directly. By looking into the source code of FrameworkElement, I found a static filed called InheritanceContextField whose type is UncommonField&amp;lt;DependencyObject&amp;gt; in which there is a SetValue method. By knowing this, I can use reflection to set the InheritanceContext manually.&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: consolas; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: consolas; color: blue; font-size: 9pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"&gt;void&lt;/span&gt;&lt;span style="font-family: consolas; font-size: 9pt; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"&gt; Window_Loaded(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs&lt;/span&gt; e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; tooltipContent = tbx.tooltip;&lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; field = &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;FrameworkElement&lt;/span&gt;).GetField(&lt;span style="color: #a31515"&gt;"InheritanceContextField"&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingFlags.&lt;span style="color: blue"&gt;static&lt;/span&gt; | BindingFlags.nonpublic);&lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; inheritanceContext=field.GetValue(&lt;span style="color: blue"&gt;null&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//type of UncommonField&amp;lt;DependencyObject&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; type = &lt;span style="color: #2b91af"&gt;Type&lt;/span&gt;.GetType(&lt;span style="color: #a31515"&gt;"System.Windows.UncommonField`1[&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #a31515"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [System.Windows.Dependencyobject,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; windowsbase, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; version=3.0.0.0, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; culture=neutral, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; publickeytoken=31bf3856ad364e35]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; windowsbase, version=3.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35"&lt;/span&gt;);&lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; setMethod=type.GetMethod(&lt;span style="color: #a31515"&gt;"SetValue"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setMethod.Invoke(inheritanceContext,&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;object&lt;/span&gt;[]{ tooltipContent,&lt;span style="color: blue"&gt;this&lt;/span&gt;});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;font size="3" face="Consolas"&gt;&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;Although it&amp;#8217;s not a good fix, it do resolve the problem. Do we have a better solution? Since ElementName binding cannot work here, we can try to use another Binding - Source Binding.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;First of all, we need to define a Spy make it inherit from Freezable class,&lt;/p&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ElementSpy &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;Freezable&lt;br/&gt;   &lt;/span&gt;{&lt;br/&gt;     &lt;br/&gt;       &lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;ValueProperty =&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"Value"&lt;/span&gt;, &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt;), &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ElementSpy&lt;/span&gt;),&lt;br/&gt;               &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;FrameworkPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue"&gt;null&lt;/span&gt;));&lt;br/&gt;   &lt;br/&gt;       &lt;span style="color: blue"&gt;public object &lt;/span&gt;Value&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt;)GetValue(ValueProperty); }&lt;br/&gt;           &lt;span style="color: blue"&gt;set &lt;/span&gt;{ SetValue(ValueProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       &lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Freezable &lt;/span&gt;CreateInstanceCore()&lt;br/&gt;       {&lt;br/&gt;           &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NotImplementedException&lt;/span&gt;();&lt;br/&gt;       }&lt;br/&gt;   }&amp;nbsp;&lt;p&gt;Then we put it into the Resource of the Window. Since Freezable object&amp;#8217;s InheritanceContext will be set to the containing element, here it&amp;#8217;s the window, Element binding will work fine for ElementSpy.&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="TestElementBindingInUserControl.MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;="MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="win"&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ElementSpy &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Key&lt;/span&gt;&lt;span style="color: blue"&gt;="spy" &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=win, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Title}"/&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color: #a31515"&gt;&lt;/span&gt;&amp;nbsp;&lt;p&gt;Now we can simply use ElementSpy as a bridge to make ElementName Binding work for ToolTip.&lt;/p&gt;&lt;p&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="TestElementBindingInUserControl.MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;        &lt;/span&gt;&lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;="MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="win"&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ElementSpy &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Key&lt;/span&gt;&lt;span style="color: blue"&gt;="spy" &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=win, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Title}"/&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button.ToolTip&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox  &lt;/span&gt;&lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;Source&lt;/span&gt;&lt;span style="color: blue"&gt;={&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource &lt;/span&gt;&lt;span style="color: red"&gt;spy&lt;/span&gt;&lt;span style="color: blue"&gt;}, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Value}"/&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button.ToolTip&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;span style="color: #a31515"&gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;&lt;/span&gt;&lt;p&gt;&lt;font color="#a31515" face="Courier New"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here is the rule how ElementName binding works:&amp;nbsp;&lt;/p&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; line-height: 18px; font-size: 12px; "&gt;&lt;ol&gt;&lt;li style="list-style-type: decimal; "&gt;Get the BindingExpression which is created by the ElementName Binding.&lt;/li&gt;&lt;li style="list-style-type: decimal; "&gt;Start from the TargetElement of the BindingExpression. If the value of BindingExpression&amp;#8217;s ResolveNamesInTemplate property is true, it will search in the TargetElement&amp;#8217;s template, if an element with the same name can be found in its template then return it, else go to next step.&lt;/li&gt;&lt;li style="list-style-type: decimal; "&gt;Keep searching on the logic tree via its logic parent or InheritanceContext(when logic parent is null), until an element which has NameScope is found, let&amp;#8217;s call it NameScopeElement. If no element owns a NameScope, search will stop.&lt;/li&gt;&lt;li style="list-style-type: decimal; "&gt;Call the NameScope.FindName method on the found NameScope.&lt;/li&gt;&lt;li style="list-style-type: decimal; "&gt;If the element is found, return it, otherwise try to get the template parent of NameScopeElement; if the template parent is null, it will stop search. or it goes back to step 3, search on the logic tree for an element owns a NameScope.&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Related resources:&lt;/p&gt;&lt;p&gt;&lt;a href="http://joshsmithonwpf.wordpress.com/2008/07/22/enable-elementname-bindings-with-elementspy/" target="_blank"&gt;Enable ElementName Bindings with ElementSpy&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codeproject.com/KB/WPF/ArtificialInheritanceCxt.aspx" target="_blank"&gt;Artificial Inheritance Contexts in WPF&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/mikehillberg/archive/2008/05/21/model-see_2c00_-model-do.aspx" target="_blank"&gt;Hillberg Freezable Trick&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://drwpf.com/blog/2008/05/22/leveraging-freezables-to-provide-an-inheritance-context-for-bindings/" target="_blank"&gt;Leveraging Freezables to Provide an Inheritance Context for Bindings&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idior/aggbug/1757151.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idior/archive/2010/06/12/1757151.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/06/07/1753452.html</id><title type="text">How does ElementName Binding work – Part 2 BindingExpression</title><summary type="text">In part 1, I gave a general finding rule for ElementName binding, it works in most cases, however there are some cases you cannot explain them with the general rule. I will cover some of them in the f...</summary><published>2010-06-07T12:28:00Z</published><updated>2010-06-07T12:28:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/06/07/1753452.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/06/07/1753452.html"/><content type="html">&lt;p&gt;In &lt;a href="http://www.cnblogs.com/idior/archive/2010/05/28/1746513.html" target="_blank"&gt;part 1&lt;/a&gt;, I gave a general finding rule for ElementName binding, it works in most cases, however there are some cases you cannot explain them with the general rule. I will cover some of them in the following articles which involve some advanced concept in WPF, like BindingExpression and InheritanceContext.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What happens when ElementName binding is used in DataTrigger?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Take a look at following codes:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window &lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="TestElementBindingInUserControl.MainWindow"&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;CustomControl1&lt;/span&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Window&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Style &lt;/span&gt;&lt;span style="color: red"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Type &lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;CustomControl1&lt;/span&gt;&lt;span style="color: blue"&gt;}"&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter &lt;/span&gt;&lt;span style="color: red"&gt;Property&lt;/span&gt;&lt;span style="color: blue"&gt;="Template"&amp;gt;&lt;br/&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ControlTemplate &lt;/span&gt;&lt;span style="color: red"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Type &lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;CustomControl1&lt;/span&gt;&lt;span style="color: blue"&gt;}"&amp;gt;&lt;br/&gt;                    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red; background-color: yellow; "&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: blue; background-color: yellow; "&gt;&lt;strong&gt;="btn"&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="PFS Button"/&amp;gt;&lt;br/&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;="tbk" /&amp;gt;&lt;br/&gt;                    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ControlTemplate.Triggers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataTrigger &lt;/span&gt;&lt;span style="color: red"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red; background-color: yellow; "&gt;&lt;strong&gt;ElementName&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: blue; background-color: yellow; "&gt;&lt;strong&gt;=btn&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;, &lt;br/&gt;                                                       &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Content}"                 &lt;br/&gt;                                     &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="PFS Button"&amp;gt;&lt;br/&gt;                            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter &lt;/span&gt;&lt;span style="color: red"&gt;TargetName&lt;/span&gt;&lt;span style="color: blue"&gt;="tbk" &lt;br/&gt;                                    &lt;/span&gt;&lt;span style="color: red"&gt;Property&lt;/span&gt;&lt;span style="color: blue"&gt;="Text" &lt;br/&gt;                                    &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="PFS TextBlock"/&amp;gt;&lt;br/&gt;                        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ControlTemplate.Triggers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;                &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter.Value&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Setter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Style&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Let&amp;#8217;s go back to our rules first:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Start from the element which applied the ElementName Binding, keep searching on the logic tree via its logic parent, until an element which has NameScope is found, let&amp;#8217;s call it NameScopeElement. If no element owns a NameScope, search will stop. &lt;/li&gt;&lt;li&gt;Call the NameScope.FindName method on the found NameScope. &lt;/li&gt;&lt;li&gt;If the element is found, return it, otherwise try to get the template parent of NameScopeElement; if the template parent is null, it will stop search. or it goes back to step 1, search on the logic tree for element owns a NameScope.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If we start from DataTrigger, you will find its logic parent would be null, the search will not continue.&amp;nbsp; Ok, I have to acknowledge the original statement is oversimplified. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;It actually starts form the TargetElement of the BindingExpression which is created by the ElementName Binding.&lt;/strong&gt; Here it is the &lt;span style="color: red"&gt;CustomControl1&lt;/span&gt;.&amp;nbsp; A little confused here? Let&amp;#8217;s see what&amp;#8217;s the BindingExpression and what&amp;#8217;s the relationship between a BindingExpression and Binding.&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.aspx" target="_blank"&gt;Binding&lt;/a&gt; class is the high-level class for the declaration of a binding; the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.aspx" target="_blank"&gt;Binding&lt;/a&gt; class provides many properties that allow you to specify the characteristics of a binding. A related class,&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.bindingexpression.aspx" target="_blank"&gt;BindingExpression&lt;/a&gt;, is the underlying object that maintains the connection between the source and the target. Normally BindingExpression is created by WPF framework, WPF programmer rarely use it in functional codes. &lt;strong&gt;A key difference between BindingExpression and Binding is that Binding only contains the Source info while BindingExpression also contains the Target info.&lt;/strong&gt; That is being said, Binding only tells you where the data comes from, while BindingExpression also defines where the data will transfer to.&amp;nbsp; &lt;/p&gt;&lt;p&gt;In most cases, the TargetElement of the BindingExpression will be the DependencyObject whose DependencyProperty is set to a Binding MarkupExtension. For example, the TargetElement of the BindingExpression will be set to the Button object in following codes:&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button &lt;/span&gt;&lt;span style="color: red"&gt;Content&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=root,&lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Title}"/&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;However our style of CustomControl1, DataTrigger is not a DependencyObject and Binding property is not a DependencyProperty either.&lt;/p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataTrigger &lt;/span&gt;&lt;span style="color: red"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=btn, &lt;/span&gt;&lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Content}"                 &lt;br/&gt;             &lt;/span&gt;&lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;="PFS Button"&amp;gt;&lt;/span&gt;&lt;p&gt;The BindingExpression will be created in a different way than others, it&amp;#8217;s created in StyleHelper.GetDataTriggerValue methods which are internal to the WPF framework. In that method, the BindingExpression&amp;#8217;s TargetElement will be set to the object which applies the style that defines the DataTrigger.&lt;/p&gt;&lt;p&gt;Ok. We are clear of where should we start the search, let&amp;#8217;s continue our search. CustomControl1 doesn&amp;#8217;t own a NameScope, so we will get his parent which is Window, since Window has a NameScope, we will call the FindName method on Window&amp;#8217;s NameScope, but we still cannot find btn. As I said both Window and ControlTemplate have their own NameScope, btn is registered in ControlTemplate&amp;#8217;s NameScope rather than Window, so you cannot find btn in Window&amp;#8217;s NameScope. &lt;/p&gt;&lt;p&gt;But if you run the above code, you will see it works. Ok, there is another point i missed in part 1.&lt;/p&gt;&lt;p&gt;When we start the search from the TargetElement of the BindingExpression,&lt;strong&gt; it will check&amp;nbsp; ResolveNamesInTemplate property of the BindingExpression&lt;/strong&gt;, if it&amp;#8217;s true, it will try to find the element defined in its template first. In our case, the BindingExpression is created from a DataTrigger, the ResolveNamesInTemplate is set to true in StyleHelper.GetDataTriggerValue method, now btn can be found.&lt;/p&gt;&lt;p&gt;Let&amp;#8217;s revised the finding rule:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Get the BindingExpression which is created by the ElementName Binding.&lt;/li&gt;&lt;li&gt;Start from the TargetElement of the BindingExpression. If the value of BindingExpression&amp;#8217;s ResolveNamesInTemplate property is true, it will search in the TargetElement&amp;#8217;s template, if an element with the same name can be found in its template then return it, else go to next step.&lt;/li&gt;&lt;li&gt;Keep searching on the logic tree via its logic parent, until an element which has NameScope is found, let&amp;#8217;s call it NameScopeElement. If no element owns a NameScope, search will stop. &lt;/li&gt;&lt;li&gt;Call the NameScope.FindName method on the found NameScope. &lt;/li&gt;&lt;li&gt;If the element is found, return it, otherwise try to get the template parent of NameScopeElement; if the template parent is null, it will stop search. or it goes back to step 3, search on the logic tree for an element owns a NameScope.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;In part 3, I will give some introduction to InheritanceContext which is also called LogicalParent 2.0. :)&lt;/div&gt;&lt;img src="http://www.cnblogs.com/idior/aggbug/1753452.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idior/archive/2010/06/07/1753452.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/06/04/1751738.html</id><title type="text">Logical Tree &amp;amp; Visual Tree</title><summary type="text">The existing documentation about the visual tree and logical tree in the Windows SDK leaves much to be desired. Ever since I started with WPF, I have felt unsure about what exactly differentiates the ...</summary><published>2010-06-04T13:14:00Z</published><updated>2010-06-04T13:14:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/06/04/1751738.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/06/04/1751738.html"/><content type="html">&lt;p class="MsoNormal"&gt;The existing documentation about the visual tree and logical tree in the Windows SDK leaves much to be desired. Ever since I started with WPF, I have felt unsure about what exactly differentiates the two. Here I will use a simple diagram to make a comparison between them.&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;Window&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;Grid&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;Label&lt;/span&gt;&lt;span style="font-family: Consolas; color: red; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt; Content&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;="xuning"/&amp;gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: Consolas; color: red; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt; Text&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;="pfs"/&amp;gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;Grid&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: Consolas; color: #a31515; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;Window&lt;/span&gt;&lt;span style="font-family: Consolas; color: blue; font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Following is the logical and visual tree of the above xaml codes:&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/idior/logicalvisualTree.jpg" width="600" height="500" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;There may be several questions come into your mind after seeing this picture:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Why those red elements are chosen to be part of logical tree?&lt;/strong&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;The secret is behind a property called LogicalChildren. Panel, ItemsControl, ContentControl, and Decorator, which are the most common base classes, all define this property make the logical tree operate already.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;For example, if you create a custom Button that subclasses ContentControl, your Content property will pick up your button as the logical parent without you doing anything.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;At the end of this article, a table lists the classes that have special support for logical children, and under which property they implement that support.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraph"&gt;&lt;/p&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin" lang="EN-US"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin" lang="EN-US"&gt;&lt;span style="mso-list: Ignore"&gt;&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;strong&gt;Why there is a TextBlock under Label&amp;#8217;s visual tree?&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Unlike the button, we didn&amp;#8217;t declare a TextBlock as the Content of Label, instead we only used a string &amp;#8220;Xuning&amp;#8221; there. Who created a TextBlock for us? Apparently, it&amp;#8217;s created by WPF framework. When WPF starts to render an object, it will first check whether there is a template defined for that type, either control template or data template, if it cannot find one, it will simply call the object&amp;#8217;s ToString method and put the return value into a TextBlock.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Why Label&amp;#8217;s logical child is a string?&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;The element in logical tree doesn&amp;#8217;t have to be a UIElement or Visual object, it can be any type. Label is a ContentControl which take its Content property as logical child, here it happens to be string &amp;#8220;xuning&amp;#8221;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Related Resources:&lt;/p&gt;&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms753391.aspx" target="_blank"&gt;Trees in WPF&amp;nbsp;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.wpftutorial.net/LogicalAndVisualTree.html" target="_blank"&gt;Logical and Visual Tree&amp;nbsp;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left" style="text-align:left;line-height:23.25pt;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://blogs.msdn.com/b/mikehillberg/archive/2008/05/23/of-logical-and-visual-trees-in-wpf.aspx" target="_blank"&gt;Of logical and visual trees inWPF&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codeproject.com/KB/WPF/WpfElementTrees.aspx" target="_blank"&gt;Understanding the Visual Tree andLogical Tree in WPF&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" align="left"&gt;&lt;span style="color: #333333; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri" lang="EN-US"&gt;&lt;/span&gt;&lt;span style="color: #333333; font-size: 12px; " class="Apple-style-span"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US"&gt;Appendix&lt;/span&gt;&lt;span style="color: #333333; font-size: 12px; " class="Apple-style-span"&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" style="margin-left:.75pt;border-collapse:collapse;mso-yfti-tbllook:1184; mso-padding-alt:0cm 0cm 0cm 0cm"&gt; &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Class&lt;/span&gt;&lt;/strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:  Calibri;mso-fareast-font-family:宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:  Calibri;mso-font-kerning:0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Property(ies)&lt;/span&gt;&lt;/strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;  mso-ascii-font-family:Calibri;mso-fareast-font-family:宋体;mso-hansi-font-family:  Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:1"&gt;  &lt;td width="638" colspan="2" valign="top" style="width:478.8pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;strong&gt;&lt;em&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:  Calibri;mso-fareast-font-family:宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:  Calibri;mso-font-kerning:0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;strong&gt;&lt;em&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;System.Windows.Controls&lt;br /&gt;  &lt;br style="mso-special-character:line-break" /&gt;  &lt;br style="mso-special-character:line-break" /&gt;  &lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:  Calibri;mso-fareast-font-family:宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:  Calibri;mso-font-kerning:0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:2"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;AdornedElementPlaceholder&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Child property&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:3"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;ContentControl&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Content&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:4"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Decorator&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Child&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:5"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Grid&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Children (inherited from Panel), Columns, Rows&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:6"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;HeaderedContentControl&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Content (inherited from ContentControl), Header&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:7"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;HeaderedItemsControl&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Items (inherited from ItemsControl), Header&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:8"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;InkCanvas&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Children&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:9"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;ItemsControl&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Items&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:10"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Page&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Content&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:11"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Panel&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Children&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:12"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;RichTextBox&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Document&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:13"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;TextBlock&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Text&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:14"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;TextBox&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Text&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:15"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;ToolBarTray&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;ToolBars&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:16"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;ViewBox&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Child&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:17"&gt;  &lt;td width="638" colspan="2" valign="top" style="width:478.8pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;strong&gt;&lt;em&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:  Calibri;mso-fareast-font-family:宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:  Calibri;mso-font-kerning:0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;strong&gt;&lt;em&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;System.Windows.Controls.Primitives&lt;br /&gt;  &lt;br style="mso-special-character:line-break" /&gt;  &lt;br style="mso-special-character:line-break" /&gt;  &lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:  Calibri;mso-fareast-font-family:宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:  Calibri;mso-font-kerning:0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:18"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;BulletDecorator&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Bullet and Child&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:19"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;DocumentViewerBase&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Document&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:20"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Popup&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Child&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:21"&gt;  &lt;td width="638" colspan="2" valign="top" style="width:478.8pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;strong&gt;&lt;em&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:  Calibri;mso-fareast-font-family:宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:  Calibri;mso-font-kerning:0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;strong&gt;&lt;em&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;System.Windows.Documents&lt;br /&gt;  &lt;br style="mso-special-character:line-break" /&gt;  &lt;br style="mso-special-character:line-break" /&gt;  &lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:  Calibri;mso-fareast-font-family:宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:  Calibri;mso-font-kerning:0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:22"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;FixedDocument&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Pages&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:23"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;FixedPage&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Children&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:24"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;FlowDocument&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Blocks&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:25"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;FlowDocumentReader&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Document&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:26"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;FlowDocumentScrollViewer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Document&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:27"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;PageContent&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Child&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:28"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Table&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;RowGroups, Columns&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt; &lt;tr style="mso-yfti-irow:29;mso-yfti-lastrow:yes"&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Span&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt;  &lt;td width="319" valign="top" style="width:239.4pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;  &lt;p class="MsoNormal" align="left" style="text-align:left;mso-pagination:widow-orphan"&gt;&lt;span lang="EN-US" style="font-size:9.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:  宋体;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-font-kerning:  0pt"&gt;Inlines&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/idior/aggbug/1751738.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idior/archive/2010/06/04/1751738.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/06/04/1751569.html</id><title type="text">Memory leak caused by EventHandle  - weak event</title><summary type="text">When using normal C# events, registering an event handler creates a strong reference from the event source to the listening object.If the source object has a longer lifetime than the listener, and th...</summary><published>2010-06-04T08:48:00Z</published><updated>2010-06-04T08:48:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/06/04/1751569.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/06/04/1751569.html"/><content type="html">&lt;p&gt;&lt;a target=""&gt;&lt;/a&gt;When using normal C# events, registering an event handler creates a  strong reference from the event source to the listening object.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If the source object has a longer lifetime than the listener, and the  listener doesn't need the events anymore when there are no other  references to it, using normal .NET events causes a memory leak: the  source object holds listener objects in memory that should be garbage  collected.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;a target="_blank" href="http://www.codeproject.com/KB/cs/WeakEvents.aspx"&gt;&lt;span style="font-size: 12pt;"&gt;An article in codeproject&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;span style="font-size: 12pt;"&gt; &lt;/span&gt;provides various patterns for resolving the memory leak caused  eventhandle.&lt;/p&gt;&lt;p&gt;1.Dispose pattern. Unhook the event handler in dispose method.&lt;/p&gt;&lt;p&gt;Disadvantages: Explicit memory management is hard, code can forget to call &lt;code&gt;Dispose&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2. 　&amp;nbsp; Use an event wrapper. &lt;/p&gt;&lt;p&gt;This solution moves  the event handling code into a wrapper class that forwards the calls to a  listener instance which is referenced with a weak reference. This weak  reference allows for easy detection if the listener is still alive.&lt;/p&gt;&lt;p&gt;Disadvantages : Leaks the wrapper instance when the event never fires.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WPF &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa970850.aspx"&gt;WeakEventManager&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;WPF has built-in support for listener-side weak events, using the &lt;code&gt;WeakEventManager&lt;/code&gt;  class. It works similar to the previous wrapper solutions, except that a  single &lt;code&gt;WeakEventManager&lt;/code&gt; instance serves as a wrapper  between multiple sender and multiple listeners. Due to this single  instance, the &lt;code&gt;WeakEventManager&lt;/code&gt; can avoid the leak when the  event is never called: registering another event on a &lt;code&gt;WeakEventManager&lt;/code&gt;  can trigger a clean-up of old events. These clean-ups are scheduled  using the WPF dispatcher, they will occur only on threads running a WPF  message loop.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Also, the &lt;code&gt;WeakEventManager&lt;/code&gt; has a restriction that our  previous solutions didn't have: it requires the sender parameter to be  set correctly, otherwise the source cannot be found in the listener's code.&lt;/p&gt;&lt;p&gt;Disadvantages: Tied to a WPF dispatcher, cannot be easily used on non-UI-threads.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;a target="_blank" href="http://groups.google.com/group/wpf-disciples/browse_thread/thread/4b18a9de327be281/2486661b5ede0fd9"&gt;&lt;span style="font-size: 12pt;"&gt;A long thread in WPF-Disciples&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt; holds a discussion on a potential bug in RelayCommand. &lt;a target="_blank" href="http://blogs.msdn.com/b/nathannesbit/archive/2009/05/29/wpf-icommandsource-implementations-leak-memory.aspx"&gt;Nathan Nesbit&lt;/a&gt; though WPF&amp;#8217;s CanExecuteChanged Implementation was Wrong.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The RelayCommand directly registers the CanExecuteChanged event handler  with the CommandManager.RequestSuggested event.&amp;nbsp; The MSDN docs say that  the CommandManager.RequestSuggested only holds a weak reference to the  handler, so shouldn't the RelayCommand also keep a strong reference to  the delegate to avoid it being collected?&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The answer is that we should either keep a strong reference to the delegate on Command Source or Listener. WPF keeps the delegate on Command Source which are Button, MenuItem and etc.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Check out the second line of HookCommand method which defined in ButtonBase:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('c077ce84-b509-4961-ac74-2c6b5bc20737')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_c077ce84-b509-4961-ac74-2c6b5bc20737" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_c077ce84-b509-4961-ac74-2c6b5bc20737" onclick="cnblogs_code_hide('c077ce84-b509-4961-ac74-2c6b5bc20737',event)" style="display: none;"&gt;&lt;div id="cnblogs_code_open_c077ce84-b509-4961-ac74-2c6b5bc20737" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;HookCommand(ICommand&amp;nbsp;command)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EventHandler&amp;nbsp;handler&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;EventHandler(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.OnCanExecuteChanged);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CanExecuteChangedHandler.SetValue(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;handler);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;command.CanExecuteChanged&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;handler;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.UpdateCanExecute();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;a target="_blank" href="http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx"&gt;&lt;span style="font-size: 12pt;"&gt;Delay's blog&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt; talks about how to use SOS and gcroot to diagnose memory leak.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;招聘广告，道富信息科技和网新恒天都招聘.NET高级开发人员和架构师。需要对.NET和面向对象设计有比较深入的了解和较好的英文读写能力，如果有 WPF&amp;nbsp;或Silverlight开发经验更佳，工作地点杭州。简历请发至 nxu &amp;nbsp;[at] statestreet [dot] com。&lt;img src="http://www.cnblogs.com/idior/aggbug/1751569.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/idior/archive/2010/06/04/1751569.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/05/31/1748112.html</id><title type="text">Resources on Debugging/Tracing WPF</title><summary type="text">It is proven that we software developers spend more time debugging than actually writing code. Guess what?!! WPF is no different… We have to debug and debug and debug! XamlParseException- How...</summary><published>2010-05-31T05:05:00Z</published><updated>2010-05-31T05:05:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/05/31/1748112.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/05/31/1748112.html"/><content type="text">It is proven that we software developers spend more time debugging than actually writing code. Guess what?!! WPF is no different… We have to debug and debug and debug! XamlParseException- How...</content></entry><entry><id>http://www.cnblogs.com/idior/archive/2010/05/28/1746513.html</id><title type="text">How does ElementName Binding work? - Part 1 Logical Tree &amp;amp; NameScope</title><summary type="text">Most developers have used {Binding ElementName= myControl , Path = myProperty} in their WPF projects, however you may find it didn’t work for you in certain cases, especially when you were build...</summary><published>2010-05-28T09:31:00Z</published><updated>2010-05-28T09:31:00Z</updated><author><name>idior</name><uri>http://www.cnblogs.com/idior/</uri></author><link rel="alternate" href="http://www.cnblogs.com/idior/archive/2010/05/28/1746513.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/idior/archive/2010/05/28/1746513.html"/><content type="text">Most developers have used {Binding ElementName= myControl , Path = myProperty} in their WPF projects, however you may find it didn’t work for you in certain cases, especially when you were build...</content></entry></feed>
