<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-254534009376227400</id><updated>2012-02-16T11:17:11.165-08:00</updated><category term='C#'/><category term='LINQ'/><category term='VisualStudio2008'/><category term='XML'/><category term='Design'/><category term='Leak'/><category term='WPF'/><category term='XAML'/><category term='UnitTest'/><category term='software development'/><title type='text'>creating stuff from Microsoft things</title><subtitle type='html'>C#, WPF, .Net: see it with Sergey Malyan.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.geekserg.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-1383889986949220524</id><published>2010-08-25T09:50:00.001-07:00</published><updated>2010-08-25T09:50:06.925-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Leak'/><title type='text'>Handling Leaking Handles</title><content type='html'>&lt;h3&gt;Problem:&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_PoWFmfZWUBI/THVJvWApymI/AAAAAAAAALw/Sh6b4Lc1_p4/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh5.ggpht.com/_PoWFmfZWUBI/THVJvpUFF4I/AAAAAAAAAL0/NpnWVO8sUW0/image_thumb%5B1%5D.png?imgmax=800" width="244" height="172" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If Handle count reaches more than &lt;a href="http://blogs.msdn.com/b/ntdebugging/archive/2006/12/18/understanding-pool-consumption-and-event-id_3a00_--2020-or-2019.aspx" target="_blank"&gt;5000&lt;/a&gt; count, whole PC might freeze and become unresponsive.&lt;/p&gt;  &lt;p&gt;In the Event Log, you might have seen: “&lt;em&gt;The server was unable to allocate from the system nonpaged pool because the pool was empty&lt;/em&gt;” message before system frozen.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This application had many wpf third party components, events and ui updates that were happening every 5 seconds, including tree updates. And it was leaking handles.&lt;/p&gt;  &lt;p&gt;I verified that by cycling major logical parts, handle leak was not happening. But it happened when the whole flow was executed. When in debug mode, following the flow, leak does not happen. This was timing related.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Cause:&lt;/h3&gt;  &lt;p&gt;Short Story Shorter, this is how I fixed it. Calling GC.Collect(2, GCCollectionMode.Forced) on each cycle fixed the leak. Yes, you would say that eventually GC should collect the thread. Here is a relevant issue that &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/2c3da48c-23b2-451b-a0c6-bf8dccc6b786" target="_blank"&gt;other people reported&lt;/a&gt;. And Microsoft defect that had to do with how GC cleans up unused threads, this is what they say:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#008040"&gt;“The problem is that CLR thread handles (and other associated data structures) are cleaned up by the finalizer thread, which normally only runs in response to a garbage collection (GC). If many threads are created and destroyed before a GC occurs (which would be the case if there were few memory allocations in the meantime) then it has the effect of &amp;quot;leaking&amp;quot; handles and memory, althgough these will be reclaimed the next time finalization is triggered. A workaround is to periodically manually trigger finalization, through calls to GC.WaitForPendingFinalizers. As I said, we are working to correct this in a future CLR release.“ –&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/430646/thread-handle-leak" target="_blank"&gt;Microsoft&lt;/a&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Solution 1:&lt;/h3&gt;  &lt;p&gt;So if you are in a long run leaking handles, see if GC.Collect(2, GCCollectionMode.Forced)&amp;#160; fixes it. If not, then you deal with logical gaps. Readon further.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Solutions 2,3,4,..:&lt;/h3&gt;  &lt;p&gt;Possible Leak Causes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://bytes.com/topic/net/answers/672732-handle-leak" target="_blank"&gt;New Threads&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;GDI objects, Images, Fonts,&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What does NOT leak Handles:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Extra subscriptions to Events do not lead to leaking &lt;strong&gt;Handles&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Dispatcher.BeginInvoke(DispatcherPriority.Normal, new ThreadStart(()&lt;strong&gt;, &lt;/strong&gt;does not leak handles. Verified.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Note:&lt;/p&gt;  &lt;p&gt;Close or Dispose on &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx" target="_blank"&gt;StreamWriter&lt;/a&gt; related objects? In most cases, it is more appropriate to Dispose it instead of Close, it depends, see &lt;a href="http://blog.tylerholmes.com/2008/09/what-difference-between-dispose-and.html" target="_blank"&gt;article Close vs. Dispose&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;More about &lt;a href="http://www.codeproject.com/KB/debug/cdbntsd5.aspx" target="_blank"&gt;Handles&lt;/a&gt;. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-1383889986949220524?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/1383889986949220524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/08/handling-leaking-handles.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/1383889986949220524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/1383889986949220524'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/08/handling-leaking-handles.html' title='Handling Leaking Handles'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_PoWFmfZWUBI/THVJvpUFF4I/AAAAAAAAAL0/NpnWVO8sUW0/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-5809721294909045657</id><published>2010-08-10T09:40:00.001-07:00</published><updated>2010-08-10T09:40:37.685-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>if This, Then else That</title><content type='html'>&lt;p&gt;If Else statements are the major part of Coding. These are the roads that split and divert the streams of logic. The point that I want to tackle here is about how phrasing the “If Else” statements can influence the mindset of writer and reader of the code. The claim that I would make is that “If” statements are better be phrased in positive term. And the operations in “If” block, are better be handling the main, a general, a positive flow of logic. And the rest is for “Else” block.&lt;/p&gt;  &lt;p&gt;Thus, developer is concentrating first on positives and only then on negatives. Goal first, diligence second. Main flow first, edge cases second. Wall first, coloring it second.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_PoWFmfZWUBI/TGGBA8OwceI/AAAAAAAAALY/z63rhjlERMw/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://lh5.ggpht.com/_PoWFmfZWUBI/TGGBBF1vKLI/AAAAAAAAALc/rY2_JNzd7zo/image_thumb%5B3%5D.png?imgmax=800" width="335" height="250" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If (something)&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;do this&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;else&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;font color="#ff0000"&gt;do that&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;By concentrating first on the positive aspect helps person to get into the subject of the statements. “&lt;font color="#0000ff"&gt;do this&lt;/font&gt;” communicates the context, a pathway towards some goal, and “&lt;font color="#ff0000"&gt;do that&lt;/font&gt;” communicates the edge case, a complimentary addition to “&lt;font color="#0000ff"&gt;do this&lt;/font&gt;”. There can not be &lt;font color="#0000ff"&gt;This&lt;/font&gt; without &lt;font color="#ff0000"&gt;That&lt;/font&gt;. &lt;font color="#0000ff"&gt;This&lt;/font&gt; and &lt;font color="#ff0000"&gt;That&lt;/font&gt; go together. What’s more important? &lt;font color="#0000ff"&gt;This&lt;/font&gt; or &lt;font color="#ff0000"&gt;That?&lt;/font&gt; Both? What’s the prioritization?&lt;font color="#0000ff"&gt;This &lt;/font&gt;&lt;font color="#000040"&gt;first&lt;/font&gt;, &lt;font color="#ff0000"&gt;That&lt;/font&gt; &lt;font color="#000040"&gt;second&lt;/font&gt;, isn’t it?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-5809721294909045657?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/5809721294909045657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/08/if-this-then-else-that.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5809721294909045657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5809721294909045657'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/08/if-this-then-else-that.html' title='if This, Then else That'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_PoWFmfZWUBI/TGGBBF1vKLI/AAAAAAAAALc/rY2_JNzd7zo/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-3555893970131825615</id><published>2010-07-02T14:06:00.000-07:00</published><updated>2010-08-27T14:07:08.572-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>.Net App Crushes on Windows Server 2003? user-defined breakpoint?</title><content type='html'>&lt;p&gt;&lt;a href="http://social.msdn.microsoft.com/forums/en-US/clr/thread/af764da0-d2ac-4ead-9e32-36be3a51949c/" target="_blank"&gt;are you in trouble?&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;&lt;a href="http://lh6.ggpht.com/_PoWFmfZWUBI/THgo-afkc-I/AAAAAAAAAMI/sDL4Kn1q5T8/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_PoWFmfZWUBI/THgo-smhUdI/AAAAAAAAAMM/PgRXD4gLenc/image_thumb%5B1%5D.png?imgmax=800" width="340" height="126" /&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h4&gt;&amp;#160;&lt;/h4&gt;  &lt;p&gt;some possible causes might be calling &lt;a href="http://blog.benhall.me.uk/2007/09/problem-with-debuggerbreak.html" target="_blank"&gt;Debugger.Break();&lt;/a&gt;, clean them up.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://stackoverflow.com/questions/36014/why-is-net-exception-not-caught-by-try-catch-block" target="_blank"&gt;Another case reported, here, no resolution though.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Another idea, catch(Exception) vs catch, more &lt;a href="http://www.netfxharmonics.com/2005/10/net-20-trycatch-and-trycatchexception/" target="_blank"&gt;here&lt;/a&gt;, did not help for me.&lt;/p&gt;  &lt;p&gt;Another fact, if you would debug this application remotely, this “user-defined breakpoint” symptom disappears. For remote debugging, see &lt;a href="http://msdn.microsoft.com/en-us/library/c6wf8e4z.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In this particular case, the cause was the null references.&lt;/p&gt;  &lt;p&gt;The hunt is still on on the real cause.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-3555893970131825615?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/3555893970131825615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/07/net-app-crushes-on-windows-server-2003.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/3555893970131825615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/3555893970131825615'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/07/net-app-crushes-on-windows-server-2003.html' title='.Net App Crushes on Windows Server 2003? user-defined breakpoint?'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_PoWFmfZWUBI/THgo-smhUdI/AAAAAAAAAMM/PgRXD4gLenc/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-5332773420758466945</id><published>2010-05-26T19:31:00.000-07:00</published><updated>2010-05-27T15:33:42.404-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>SelectedItem disables associated Buttons</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_PoWFmfZWUBI/S_7zQ6m8hyI/AAAAAAAAAKk/osIN9p5sAWw/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_PoWFmfZWUBI/S_7zRTPMg3I/AAAAAAAAAKo/vmSE9ru4TJw/image_thumb.png?imgmax=800" width="244" height="182" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Situation: &lt;/strong&gt;There is a List, and some buttons that are ought to act on current selected item in the list. But if there are no items or no item is selected then you want these buttons to be disabled.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The idea: &lt;/strong&gt;Having buttons disabled/enabled implicitly/automatically based on the currently selected item in the list.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4a2beecb-44c1-4fb1-903c-37e8f7d4e7f7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Style:&lt;/div&gt; &lt;div style="background: #ddd; max-height: 100px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;disableIfNoListItemSelected&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;x:Type Button}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;BasedOn&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;StaticResource {x:Type Button}}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;UIElement.IsEnabled&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;True&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;Binding SelectedIndex}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;-1&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;UIElement.IsEnabled&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;False&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4a3a2c9c-acc6-4619-8c92-f107d1ca623b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Usage:&lt;/div&gt; &lt;div style="background: #ddd; max-height: 200px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Button&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;cmdShow&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                   &lt;span style="color:#ff0000"&gt; DataContext&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000"&gt; ElementName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=grdTemplates}&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                   &lt;span style="color:#ff0000"&gt; Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; disableIfNoListItemSelected}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Button&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Notice in the usage, when applying a style to a button, it is required to assign a DataContext of this button to the List that is being watched.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-5332773420758466945?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/5332773420758466945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/selecteditem-disables-associated.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5332773420758466945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5332773420758466945'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/selecteditem-disables-associated.html' title='SelectedItem disables associated Buttons'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_PoWFmfZWUBI/S_7zRTPMg3I/AAAAAAAAAKo/vmSE9ru4TJw/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-2877062859135650505</id><published>2010-05-18T20:08:00.000-07:00</published><updated>2010-05-21T10:40:38.997-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>Closing Modal Dialog Window in WPF</title><content type='html'>&lt;p&gt;If it is a modal dialog box, then it most probably has OK, Cancel buttons. If it has OK, Cancel buttons, them most probably the “client initiator” wants to know if Ok was pressed or not.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_PoWFmfZWUBI/S_SLkcZGSrI/AAAAAAAAAKM/TqbWXxDKhTA/s1600-h/image%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_PoWFmfZWUBI/S_SLk0pDL4I/AAAAAAAAAKQ/d9hD0MgtgQE/image_thumb.png?imgmax=800" width="244" height="52" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Remember WinForms had &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.dialogresult(VS.80).aspx"&gt;DialogResult&lt;/a&gt; enumeration? It is a bit different with WPF, ShowDialog() returns &lt;strong&gt;bool?.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="4"&gt;&lt;strong&gt;&lt;span style="color: blue"&gt;bool&lt;/span&gt;?&lt;/strong&gt;&lt;/font&gt; result = form.ShowDialog();&lt;span style="color: blue"&gt;if &lt;/span&gt;(result.HasValue &amp;amp;&amp;amp; result.Value){ &lt;span style="color: #2b91af"&gt;DoMyThing();&lt;/span&gt;}&lt;/p&gt;  &lt;p&gt;When will result.Value be false?&amp;#160; Make sure that you do this only for True/Ok case, the default is false:&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;Ok_Click(&lt;span style="color: blue"&gt;..&lt;/span&gt;){ &lt;span style="color: blue"&gt;this&lt;/span&gt;.Close(); &lt;strong&gt;&lt;u&gt;&lt;font size="4"&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.DialogResult = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;}&lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;p&gt;and one more thing. To close dialog on Esc, you want this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_PoWFmfZWUBI/S_SLlLblyKI/AAAAAAAAAKU/amrKQqaMpL4/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_PoWFmfZWUBI/S_SLleB3DwI/AAAAAAAAAKY/6kTNXCNOY9Y/image_thumb%5B1%5D.png?imgmax=800" width="244" height="115" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For OK button you want this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_PoWFmfZWUBI/S_WYwIjUWkI/AAAAAAAAAKc/-C1wPZOIFms/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh6.ggpht.com/_PoWFmfZWUBI/S_WYwRiDv5I/AAAAAAAAAKg/ASIXcrz4Qew/image_thumb%5B2%5D.png?imgmax=800" width="244" height="86" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This way, when user presses Enter, OK button is pressed.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Warning about IsCancel and Cancel button. There seems no way to Cancel the “Cancel event”. So if user clicks Cancel, windows is going to be closed. If you know a way for canceling the closure, please post.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-2877062859135650505?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/2877062859135650505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/closing-modal-dialog-window-in-wpf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2877062859135650505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2877062859135650505'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/closing-modal-dialog-window-in-wpf.html' title='Closing Modal Dialog Window in WPF'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_PoWFmfZWUBI/S_SLk0pDL4I/AAAAAAAAAKQ/d9hD0MgtgQE/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-346757910434362779</id><published>2010-05-12T19:54:00.000-07:00</published><updated>2010-05-18T15:33:52.993-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>Implicitly “degrading” ui controls</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/05/hide-enable-triggers.html";digg_title = "Implicitly “degrading” ui controls";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;If this is valuable then mostly as an idea for now. Current implementation might be too limited and can be further enhanced. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;The goal is to hide or disable ui controls if they do not show anything, or whatever they show is missing. Degrades=Hide or Disable.&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In WPF terms and in this cut, I’ve made that ui control becomes hidden or disabled automatically if when DataContext becomes null. This implies that host has to be bound to something real, and presence of that real thing implicitly degrades(or not) the host.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6282f3ea-20d4-4597-933d-54fa5fd852e7" class="wlWriterSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Styles from Resources&lt;/div&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;hideStackPanelIfNull&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;StackPanel&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;BasedOn&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;StaticResource {x:Type StackPanel}}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;UIElement.Visibility&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;x:Static Visibility.Visible}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;Binding}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;x:Null}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;UIElement.Visibility&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;x:Static Visibility.Hidden}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;disableButtonIfNull&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Button&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;BasedOn&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;StaticResource {x:Type Button}}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;UIElement.IsEnabled&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;True&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;Binding}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;x:Null}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;UIElement.IsEnabled&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;False&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;disableStackPanelIfNull&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;StackPanel&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;BasedOn&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;StaticResource {x:Type StackPanel}}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;UIElement.IsEnabled&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;True&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;Binding}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;x:Null}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;UIElement.IsEnabled&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;False&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;DataTrigger&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Triggers&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:03ebe731-4fb4-46f1-9b5e-c07944828783" class="wlWriterSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Usage Example&lt;/div&gt; &lt;div style="background: #fff; max-height: 100px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;StackPanel&lt;/span&gt; &lt;span style="color:#ff0000"&gt; DataContext&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000"&gt; ElementName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=myList,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=SelectedItem}&amp;quot;&lt;/span&gt; &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;         &lt;span style="color:#ff0000"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Orientation&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Horizontal&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="color:#ff0000"&gt; Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; hideStackPanelIfNull}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Name:&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=Name}&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#a31515"&gt;&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In this example StackPanel is bound to SelectedItem. If there is nothing in the list, SelectedItem becomes null and that degrades the controls that bear presented here styles, textblocks become disabled or hidden. &lt;/p&gt;  &lt;p&gt;Some caveat. Obviously this requires to overwrite your style. It might conflict with your style requirements. In above shown example I am pointing to StackPanels which usually do not need style.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-346757910434362779?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/346757910434362779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/hide-enable-triggers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/346757910434362779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/346757910434362779'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/hide-enable-triggers.html' title='Implicitly “degrading” ui controls'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-6000702635368127985</id><published>2010-05-12T19:49:00.000-07:00</published><updated>2010-05-13T13:48:30.373-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>Converter</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/05/converter.html";digg_title = "Converter";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;WPF binding binds &lt;strong&gt;one&lt;/strong&gt; thing to &lt;strong&gt;another&lt;/strong&gt; based on default conversion. For fancier conversion there is &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx"&gt;Converter&lt;/a&gt;. With Converter you can map more than one things to one thing.&lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f4a47c04-f043-4558-b9a7-095a2351369d" class="wlWriterSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;User List in a Combo Box&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt; Convert(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; value, &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt; targetType, &lt;span style="color:#0000ff"&gt;object&lt;/span&gt; parameter, CultureInfo culture)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; name = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Empty;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (value &lt;span style="color:#0000ff"&gt;is&lt;/span&gt; MyUser)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            MyUser user = value &lt;span style="color:#0000ff"&gt;as&lt;/span&gt; MyUser ;&lt;/li&gt; &lt;li&gt;            name = &lt;span style="color:#0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;&amp;quot;{0}{1}[{2}]&amp;quot;&lt;/span&gt;, user.FirstName, user.LastName, user.ZipCode.ToString());&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        }&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; name;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    }… …&amp;lt;local:&lt;span style="color:#2b91af"&gt;UserNameConverter&lt;/span&gt; x:&lt;span style="color:#2b91af"&gt;Key&lt;/span&gt;=&lt;span style="color:#a31515"&gt;&amp;quot;userNameConverter&amp;quot;&lt;/span&gt;/&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ComboBox&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &amp;lt;&lt;span style="color:#2b91af"&gt;ComboBox&lt;/span&gt;.ItemTemplate&amp;gt;&lt;/li&gt; &lt;li&gt;    &amp;lt;&lt;span style="color:#2b91af"&gt;DataTemplate&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &amp;lt;&lt;span style="color:#2b91af"&gt;StackPanel&lt;/span&gt; Orientation=&lt;span style="color:#a31515"&gt;&amp;quot;Horizontal&amp;quot;&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li&gt;        &amp;lt;TextBlock Text=&lt;span style="color:#a31515"&gt;&amp;quot;{Binding Converter={StaticResource userNameConverter}}&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &amp;lt;/StackPanel&amp;gt;&lt;/li&gt; &lt;li&gt;    &amp;lt;/&lt;span style="color:#2b91af"&gt;DataTemplate&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &amp;lt;/&lt;span style="color:#2b91af"&gt;ComboBox&lt;/span&gt;.ItemTemplate&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;lt;/&lt;span style="color:#2b91af"&gt;ComboBox&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Some Advanced Converters on Codeplex.com is &lt;a href="http://wpfconverters.codeplex.com/wikipage?title=User%20Documentation&amp;amp;referringTitle=Home#CaseConverter"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-6000702635368127985?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/6000702635368127985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/converter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6000702635368127985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6000702635368127985'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/converter.html' title='Converter'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-7127313483399263388</id><published>2010-05-05T20:05:00.000-07:00</published><updated>2010-05-05T20:05:00.728-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio2008'/><title type='text'>Troubles with VS2008 WPF Designer Crushes</title><content type='html'>&lt;p&gt;Event log:&lt;/p&gt;  &lt;p&gt;.NET Runtime version 2.0.50727.3603 - Fatal Execution Engine Error (7A2E10D2) (0) &lt;/p&gt;  &lt;p&gt;EventType clr20r3, P1 devenv.exe, P2 9.0.30729.1, P3 488f2b50, P4 NIL, P5 NIL, P6 NIL, P7 NIL, P8 NIL, P9 NIL, P10 NIL. &lt;/p&gt;  &lt;p&gt;Faulting application devenv.exe, version 9.0.30729.1, stamp 488f2b50, faulting module kernel32.dll, version 5.1.2600.5781, stamp 49c4f482, debug? 0, fault address 0x00012afb. &lt;/p&gt;  &lt;p&gt;Some relevant but not useful suggestions:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/Thread/View.aspx?ProjectName=PowerCommands&amp;amp;ThreadId=759&amp;amp;FocusElement=ctl00_ctl00_Content_TabContentPanel_Content_NewPostTextBox_TabContentPanel_EditTextBox&amp;amp;wa=wsignin1.0"&gt;1&lt;/a&gt;, &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vssetup/thread/e2434065-9921-4861-b914-9cc9d6c55553/"&gt;2&lt;/a&gt;, &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=KB963035&amp;amp;DownloadId=5745"&gt;3&lt;/a&gt;, &lt;a href="http://pnotepad.org/forums/topic/670"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/a&gt;,&amp;#160; any other ones ? &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-7127313483399263388?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/7127313483399263388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/troubles-with-vs2008-wpf-designer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7127313483399263388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7127313483399263388'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/troubles-with-vs2008-wpf-designer.html' title='Troubles with VS2008 WPF Designer Crushes'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-6016948871539590158</id><published>2010-05-04T20:33:00.000-07:00</published><updated>2010-06-07T17:56:09.647-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>Telerik vs. Xceed</title><content type='html'>&lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/TA2P2M8lqzI/AAAAAAAAALA/RBo7b6hn2UY/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_PoWFmfZWUBI/TA2P2cCn9nI/AAAAAAAAALE/lBuwcnKECN0/image_thumb%5B3%5D.png?imgmax=800" width="383" height="109" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;See above for a bit of syntax. Preatty similar structure. But &lt;a href="http://www.telerik.com/"&gt;Telerik&lt;/a&gt; has TextAlignment, daaa, &lt;a href="http://xceed.com/pages/TopMenu/Products/ProductSearch.aspx?Lang=EN-CA"&gt;Xceed&lt;/a&gt; does not. &lt;strong&gt;1:0&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/TA2P2TWkwGI/AAAAAAAAALI/fhy1AbMg5W4/s1600-h/image%5B12%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh3.ggpht.com/_PoWFmfZWUBI/TA2P2tBvV_I/AAAAAAAAALM/83pXKGMun6g/image_thumb%5B6%5D.png?imgmax=800" width="157" height="122" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;On the left. Telerik lets you specify “Auto” or prioritize Column Widths, just like with standard Grid’s Rows/Columns. &lt;a href="http://xceed.com/pages/TopMenu/Products/ProductSearch.aspx?Lang=EN-CA"&gt;Xceed&lt;/a&gt; does not have this. Xceed will resize the column, but twice more space than needed, useless. &lt;strong&gt;2:0, &lt;/strong&gt;Telerik is winning.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;One more thing, Xceed demands uniqueness for FieldNames. This limits columns that would rather accept “.” binding of item itself and bind deeper inside the template. This is not good, Telerik scores one more. to sum up: &lt;strong&gt;3:0&lt;/strong&gt;, Telerik wins in this context.&lt;/p&gt;  &lt;p&gt;As you can see, this comparison is based on basic features. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-6016948871539590158?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/6016948871539590158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/telerik-vs-xceed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6016948871539590158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6016948871539590158'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/telerik-vs-xceed.html' title='Telerik vs. Xceed'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_PoWFmfZWUBI/TA2P2cCn9nI/AAAAAAAAALE/lBuwcnKECN0/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-8077499029912695527</id><published>2010-05-02T20:17:00.000-07:00</published><updated>2010-05-13T13:17:52.645-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Pyramid</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/05/pyramid.html";digg_title = "Pyramid";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;If you would try to visualize an architecture of the product, how would it look like ?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/S-xebI_KlVI/AAAAAAAAAKE/pTdxbIRL34w/s1600-h/image%5B10%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_PoWFmfZWUBI/S-xebvAkvTI/AAAAAAAAAKI/mszHaDBroTU/image_thumb%5B6%5D.png?imgmax=800" width="242" height="161" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;One of the course idea for architecture is an awareness of layers, one on another, looks like Pyramid. Each layer references next one. Layers do not jump over each other. Keeping a notion of Parent-&amp;gt;Child relationship or Client-Server or Master-Slave(this term is not used anymore).&lt;/p&gt;  &lt;p&gt;For every class there is a client, so Class is a “server” and most probably it references another one. So that class is a “server” and a client for another server. &lt;/p&gt;  &lt;p&gt;so per this concept. &lt;/p&gt;  &lt;p&gt;rule 1: parent can reference child and not the child’s child&lt;/p&gt;  &lt;p&gt;rule 2: child does not tell parent what to do, maximum it tells parent what has happened in means of return values or events. Parent will decide on next actions.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-8077499029912695527?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/8077499029912695527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/pyramid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/8077499029912695527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/8077499029912695527'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/pyramid.html' title='Pyramid'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_PoWFmfZWUBI/S-xebvAkvTI/AAAAAAAAAKI/mszHaDBroTU/s72-c/image_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-7842693709600433692</id><published>2010-05-01T14:09:00.000-07:00</published><updated>2010-08-26T14:09:50.167-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>AssemblyDescription, marking with build type</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/THbYGCXEsLI/AAAAAAAAAL4/5OHa1jGCvNs/s1600-h/image%5B8%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh5.ggpht.com/_PoWFmfZWUBI/THbYGpKQ5xI/AAAAAAAAAL8/aJIL_a_t4MM/image_thumb%5B4%5D.png?imgmax=800" width="117" height="122" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;It might a be a useful idea to mark your assemblies for Debug or Release modes. So that when looking in Windows Explorer, you could determine right away, what kind of dll/exe is this.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;#if DEBUG   &lt;br /&gt;[assembly: AssemblyDescription(&amp;quot;AS2-Debug&amp;quot;)]    &lt;br /&gt;#else     &lt;br /&gt;[assembly: AssemblyDescription(&amp;quot;AS2-Release&amp;quot;)]     &lt;br /&gt;#endif&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_PoWFmfZWUBI/THbYG9jH1cI/AAAAAAAAAMA/tgBq3rnvieU/s1600-h/image%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_PoWFmfZWUBI/THbYHb39wCI/AAAAAAAAAME/usKRWN62GCY/image_thumb%5B3%5D.png?imgmax=800" width="362" height="219" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-7842693709600433692?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/7842693709600433692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/assemblydescription-marking-with-build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7842693709600433692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7842693709600433692'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/assemblydescription-marking-with-build.html' title='AssemblyDescription, marking with build type'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_PoWFmfZWUBI/THbYGpKQ5xI/AAAAAAAAAL8/aJIL_a_t4MM/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-5082563570803987980</id><published>2010-04-25T17:45:00.000-07:00</published><updated>2010-04-26T17:57:07.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>Showing a button in Xceed DataGridView column</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/04/showing-button-in-xceed-datagridview.html";digg_title = "Showing a button in Xceed DataGridView column";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/S9Y2YUO30SI/AAAAAAAAAJ8/DN118eLYaPo/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://lh6.ggpht.com/_PoWFmfZWUBI/S9Y2YjLJkCI/AAAAAAAAAKA/UVmS4EC0fo8/image_thumb%5B1%5D.png?imgmax=800" width="244" height="206" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Want to have a button in a Grid?&lt;/p&gt;  &lt;p&gt;3 things are here:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Grid definition&lt;/li&gt;    &lt;li&gt;column definition&lt;/li&gt;    &lt;li&gt;Template for button&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;1. Grid: &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xcdg:DataGridControl &lt;/span&gt;&lt;span style="color: red"&gt;x:Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;mGrid&lt;/span&gt;&amp;quot; /&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;2. Columns:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xcdg:DataGridControl.Columns&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;xcdg:Column &lt;/span&gt;&lt;span style="color: red"&gt;FieldName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;MyThing&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Things&lt;/span&gt;&amp;quot;&lt;br /&gt;               &lt;span style="color: red"&gt;VisiblePosition&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&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;xcdg:Column &lt;/span&gt;&lt;span style="color: red"&gt;FieldName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;.&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Title&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Action&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;MinWidth&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;100&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;MaxWidth&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;200&lt;/span&gt;&amp;quot;            &lt;font size="4"&gt;&lt;span style="color: red"&gt;&lt;strong&gt;&lt;u&gt;CellContentTemplate&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;{StaticResource ActionButtons}&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;xcdg:DataGridControl.Columns&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;3. and the actual template:&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UserControl.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataTemplate &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;= &amp;quot;ActionButtons&amp;quot;&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;StackPanel &lt;/span&gt;&lt;span style="color: red"&gt;Orientation&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Horizontal&amp;quot;&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &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;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: red"&gt;NextAction&lt;/span&gt;&lt;span style="color: blue"&gt;}&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;DataContext&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: blue"&gt;}&amp;quot; &lt;/span&gt;&lt;span style="color: red"&gt;IsEnabled&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding &lt;/span&gt;&lt;span style="color: red"&gt;Enabled&lt;/span&gt;&lt;span style="color: blue"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="color: red"&gt;Click&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;NextAction_Click&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &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;br /&gt;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DataTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;UserControl.Resources&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-5082563570803987980?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/5082563570803987980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/showing-button-in-xceed-datagridview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5082563570803987980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5082563570803987980'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/showing-button-in-xceed-datagridview.html' title='Showing a button in Xceed DataGridView column'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_PoWFmfZWUBI/S9Y2YjLJkCI/AAAAAAAAAKA/UVmS4EC0fo8/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-3070449747390555176</id><published>2010-04-21T13:06:00.001-07:00</published><updated>2010-05-04T16:23:55.000-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>LINQ Examples</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/04/linq-examples.html";digg_title = "LINQ Examples";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Some basic LINQ examples for queering into collections.LINQ extension here: &lt;a href="http://msdn.microsoft.com/en-us/library/bb341635(v=VS.100).aspx"&gt;msdn&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;var newThings = from thing in allThings    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where thing.Stamp &amp;gt;= dateYesterday     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select thing;&lt;/p&gt;  &lt;p&gt;extracting different collection structure: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt; ids = mUsers.Select(u =&amp;gt; u.GUID);&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;getting unique ones:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IEnumerable&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; uniqueIds = ids.Distinct&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();&lt;/strong&gt;&lt;/p&gt; &lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;p&gt;finding one:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IEnumerable&amp;lt;User&amp;gt; users = mUsers.Where(u =&amp;gt; u.GUID == thatGUID);&lt;/strong&gt;&lt;/p&gt; &lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;p&gt;flattens the resulting sequences into one sequence &lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;IEnumerable&amp;lt;Locations&amp;gt; places = mUsers.&lt;/strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb534336.aspx"&gt;&lt;strong&gt;SelectMany&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;(u =&amp;gt; u.Locations);&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-3070449747390555176?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/3070449747390555176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/linq-examples.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/3070449747390555176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/3070449747390555176'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/linq-examples.html' title='LINQ Examples'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-2978547524633147131</id><published>2010-04-18T19:40:00.000-07:00</published><updated>2010-05-04T16:37:28.963-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>Flattening structure for Hierarchical display</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/04/flattening-structure-for-hierarchical.html";digg_title = "Flattening structure for Hierarchical display";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_PoWFmfZWUBI/S8zsKg5xwKI/AAAAAAAAAJs/_yvKinrT1sY/s1600-h/image%5B6%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://lh6.ggpht.com/_PoWFmfZWUBI/S8zsK9fq2bI/AAAAAAAAAJw/CiTv_L4_PyA/image_thumb%5B4%5D.png?imgmax=800" width="173" height="246" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I’ve been dealing before with &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.hierarchicaldatatemplate.aspx"&gt;HierarchicalDataTemplate&lt;/a&gt; where one Template references another one for 2 level hardcoded data structure. What about data that recursively references several &lt;strong&gt;types &lt;/strong&gt;of “children”. Plus each type shows itself uniquely. How to visualize this ? &lt;/p&gt;  &lt;h6&gt;&lt;em&gt;See tree screenshot as an example. In this example we have 3 data types: Drive, Folder, Files. Drive is a top level. Folder references Folder and Files.&lt;/em&gt;&lt;/h6&gt;  &lt;p&gt;Here is an overview of relationships between TreeView and Data Templates.&lt;/p&gt;  &lt;p&gt;We need 2 things: &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx"&gt;DataTemplateSelector&lt;/a&gt; and “HierarchyConverter”. &lt;/p&gt;  &lt;p&gt;HierarchyConverter is &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx"&gt;IValueConverter&lt;/a&gt;. HierarchyConverter parses through given object and returns “Children”, one level after another.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx"&gt;DataTemplateSelector&lt;/a&gt; returns a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.hierarchicaldatatemplate.aspx"&gt;HierarchicalDataTemplate&lt;/a&gt; based on given object Type. Similar object types that were handled in HierarchyConverter. &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx"&gt;DataTemplateSelector&lt;/a&gt; is assigned to &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplateselector.aspx"&gt;ItemTemplateSelector&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Each data type has an appropriate &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.hierarchicaldatatemplate.aspx"&gt;HierarchicalDataTemplate&lt;/a&gt;. Top level data template(Drive in our example) engages &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx"&gt;DataTemplateSelector&lt;/a&gt;. And all data types engage HierarchyConverter.&lt;/p&gt;  &lt;p&gt;Top Level Template:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&amp;lt;HierarchicalDataTemplate x:Key=&lt;span style="color: #006080"&gt;&amp;quot;DriveTemplate&amp;quot;&lt;/span&gt;&lt;br /&gt;                          ItemTemplateSelector=&lt;span style="color: #006080"&gt;&amp;quot;{StaticResource TreeTemplateSelector}&amp;quot;&lt;/span&gt; &lt;br /&gt;                          ItemsSource=&lt;span style="color: #006080"&gt;&amp;quot;{Binding Converter={StaticResource HierarchyConverter}}&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The rest of levels follow similar format:&lt;br /&gt;  &lt;br /&gt;&lt;strong&gt;&amp;lt;HierarchicalDataTemplate x:Key=&amp;quot;FolderTemplate&amp;quot;&amp;#160; DataType=&amp;quot;{x:Type Framework:Folder}&amp;quot;&lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ItemsSource=&amp;quot;{Binding Converter={StaticResource HierarchyConverter}}&amp;quot;&amp;gt;&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And to start it with your favorite Tree View:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&amp;lt;my:CustomTreeView Name=&amp;quot;MyTree&amp;quot; ItemTemplate=&amp;quot;{StaticResource DriveTemplate}&amp;quot;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;Let’s try to summarize data flow here. TreeView accepts data and streams to DriveTemplate. DriveTemplate sticks around until Folder in means of HierarchyConverter, while engaging TemplateSelector. At that time, different DataTemplates are activated which again engage recursive nature of HierarchyConverter.&lt;/p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-2978547524633147131?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/2978547524633147131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/flattening-structure-for-hierarchical.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2978547524633147131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2978547524633147131'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/flattening-structure-for-hierarchical.html' title='Flattening structure for Hierarchical display'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_PoWFmfZWUBI/S8zsK9fq2bI/AAAAAAAAAJw/CiTv_L4_PyA/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-407824973103001549</id><published>2010-04-16T17:58:00.001-07:00</published><updated>2010-05-06T13:26:16.664-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>WPF Threads: Dispatcher</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/04/wpf-threads-dispatcher.html";digg_title = "WPF Threads: Dispatcher";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Apparently WPF framework became a bit smarter in terms of threads comparing to Windows Forms.There is &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163328.aspx"&gt;Dispatcher&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Now you might be forced to queue UI actions like this:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;Dispatcher.Invoke(DispatcherPriority.Send, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ThreadStart(() =&amp;gt;&lt;br /&gt;{&lt;br /&gt;    MyTree.SelectedItem = folderToEdit;&lt;br /&gt;}));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Another example for single no parameter function:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;Dispatcher.BeginInvoke(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;(() =&amp;gt;&lt;br /&gt;{&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-407824973103001549?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/407824973103001549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/wpf-threads-dispatcher.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/407824973103001549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/407824973103001549'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/wpf-threads-dispatcher.html' title='WPF Threads: Dispatcher'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-7727341200118784597</id><published>2010-04-14T16:52:00.001-07:00</published><updated>2010-06-04T16:36:14.030-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>WPF UI Automation</title><content type='html'>&lt;p&gt;Some things to be aware of when engaging &lt;a href="http://msdn.microsoft.com/en-us/library/ms747327.aspx"&gt;Microsoft Automation&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;1. Run &lt;a href="http://msdn.microsoft.com/en-us/library/ms727247.aspx"&gt;UI SPY&lt;/a&gt; to browse around your app structure.&lt;/p&gt;  &lt;p&gt;2. Expand Controls that do not support UI Automation&lt;/p&gt;  &lt;p&gt;3. Provide “good” AutomationProperties.AutomationId for controls.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Why would you expose UserControl for Automation?&lt;/strong&gt; Some third party user controls do not support automation. Or you might want to expose custom UI structure that tailored towards desired Testing.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How to expose UserControl and see it in UI Spy ?&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Something like that:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_PoWFmfZWUBI/S8ZVpcBWInI/AAAAAAAAAJE/94N6w1Tbxj4/s1600-h/image%5B18%5D.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_PoWFmfZWUBI/S8ZVpgdu0PI/AAAAAAAAAJI/6Aol7bRUeWs/image_thumb%5B14%5D.png?imgmax=800" width="363" height="226" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2e4af665-afef-4f51-8c5f-97dcd1078a36" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;filling AutomationId&lt;/div&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;AutomationEnabledRibbonGroup&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;ribbon:Group&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;AutomationProperties.AutomationId&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;Binding RelativeSource={RelativeSource Self}, Path=Label}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;AutomationEnabledButton&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;x:Type Button}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;BasedOn&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;StaticResource {x:Type Button}}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:#008000"&gt; Buttons without Name/x:Name have no AutomationId, this setter initializes id with the button&amp;#39;s text  &lt;/span&gt;&lt;span style="color:#0000ff"&gt;--&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;AutomationProperties.AutomationId&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;Binding RelativeSource={RelativeSource Self}, Path=Content}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style.Setters&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;AutomationEnabledListBoxItem&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;TargetType&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;x:Type ListBoxItem}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;BasedOn&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;StaticResource {x:Type ListBoxItem}}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;AutomationProperties.AutomationId&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;{&lt;span style="color:#0000ff"&gt;Binding RelativeSource={RelativeSource Self}, Path=Content}&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-7727341200118784597?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/7727341200118784597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/wpf-ui-automation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7727341200118784597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7727341200118784597'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/wpf-ui-automation.html' title='WPF UI Automation'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_PoWFmfZWUBI/S8ZVpgdu0PI/AAAAAAAAAJI/6Aol7bRUeWs/s72-c/image_thumb%5B14%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-2325600611105116369</id><published>2010-04-08T14:44:00.001-07:00</published><updated>2010-04-08T14:44:55.464-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='XAML'/><title type='text'>Member Variables in XAML?</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/04/member-variables-in-xaml.html";digg_title = "Member Variables in XAML?";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/S75OU0rdi-I/AAAAAAAAAI0/tbGA_t7Rvbg/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_PoWFmfZWUBI/S75OVfPUFsI/AAAAAAAAAI4/SZWXaWh0Zog/image_thumb%5B1%5D.png?imgmax=800" width="353" height="128" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;What &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary.aspx"&gt;ResourceDictionary&lt;/a&gt; is for ? It’s a descriptive way of defining “member variables” in XAML itself. Similar to member variables defined in good old Class definitions. &lt;/p&gt;  &lt;p&gt;Define it in the XAML through means of Resources. Get it back in C# with FindResource.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-2325600611105116369?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/2325600611105116369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/member-variables-in-xaml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2325600611105116369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2325600611105116369'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/member-variables-in-xaml.html' title='Member Variables in XAML?'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_PoWFmfZWUBI/S75OVfPUFsI/AAAAAAAAAI4/SZWXaWh0Zog/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-7041893821211676754</id><published>2010-04-08T13:29:00.001-07:00</published><updated>2010-05-04T16:40:47.037-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>WPF requires Data Structure</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/04/wpf-requires-data-structure.html";digg_title = "WPF requires Data Structure";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;I’ve been working recently with some legacy architecture which is heavy xml based. There are several remotely distributed servers. Whole business model is exchanged in means of xml streams. No data structures. Now Go and visualize it in WPF UI. Nothing to bind to.&lt;/p&gt;  &lt;p&gt;What I end up doing over and over again is creating Data Structures internally from xml streams(&lt;a href="http://www.altova.com/download/xmlspy/xml_editor_enterprise.html"&gt;AltovaXML&lt;/a&gt; helps). This way UI can bind to something. &lt;/p&gt;  &lt;h4&gt;WPF loves Data Structure.&lt;/h4&gt;  &lt;p&gt;My selfish preferences: Create Classes for Data. Rely on them. Pass them in interfaces. Please no text/xml streams.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-7041893821211676754?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/7041893821211676754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/wpf-requires-data-structure.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7041893821211676754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7041893821211676754'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/wpf-requires-data-structure.html' title='WPF requires Data Structure'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-6232508595379189796</id><published>2010-04-06T13:40:00.001-07:00</published><updated>2010-04-06T13:55:41.759-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Creating MenuItems dynamically</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/04/creating-menuitems-dynamically.html";digg_title = "Creating MenuItems dynamically";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_PoWFmfZWUBI/S7ucF5LPsQI/AAAAAAAAAIk/FiOgGOoCdYc/s1600-h/image9.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh5.ggpht.com/_PoWFmfZWUBI/S7ucGBbNnkI/AAAAAAAAAIo/DL0b4h7BVYI/image_thumb5.png?imgmax=800" width="198" height="111" /&gt;&lt;/a&gt; This approach is for creating context menu programmatically in .NET3.5/WPF. This is useful when menu structure is variable and dependable.&lt;/p&gt;  &lt;p&gt;First there is “MyMenuItem” data structure. It maps to single &lt;a href="http://lh4.ggpht.com/_PoWFmfZWUBI/S7ucGV__ySI/AAAAAAAAAIs/Fq3NKxNEsO4/s1600-h/image13.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://lh6.ggpht.com/_PoWFmfZWUBI/S7ucGti8WAI/AAAAAAAAAIw/mxBJQ4DAPUo/image_thumb7.png?imgmax=800" width="244" height="192" /&gt;&lt;/a&gt;menu item. You create these objects, link together, and pass over to MenuManager. MenuManager would in turn convert them into real windows &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.menuitem.aspx"&gt;MenuItems&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Client Example:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;List&amp;lt;MenuItem&amp;gt; menuItems = mMenuManager.Build(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;MyMenuItem&amp;gt;() { &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MyMenuItem() { Label = &lt;span style="color: #006080"&gt;&amp;quot;1111&amp;quot;&lt;/span&gt;},&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MyMenuItem() { Label = &lt;span style="color: #006080"&gt;&amp;quot;1111&amp;quot;&lt;/span&gt;},&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MyMenuItem() { Label = &lt;span style="color: #006080"&gt;&amp;quot;1111&amp;quot;&lt;/span&gt;},&lt;br /&gt;    });&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (MenuItem menuItem &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; menuItems)&lt;br /&gt;    MyContextMenu.Items.Add(menuItem);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt; MenuManager.cs file &lt;strong&gt;here&lt;/strong&gt;:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 125px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;br /&gt;  &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Controls;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Media.Imaging;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; sergeymalyan.blogspot.com&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyMenuItem&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Label { get; set; }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Image ImageIcon { get; set; }&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; Tag { get; set; }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; List&amp;lt;MyMenuItem&amp;gt; DeeperItems&lt;br /&gt;        {&lt;br /&gt;            get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; mDeeperItems; }&lt;br /&gt;            set { mDeeperItems = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;MyMenuItem&amp;gt;(&lt;span style="color: #0000ff"&gt;value&lt;/span&gt;); }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; List&amp;lt;MyMenuItem&amp;gt; mDeeperItems = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;MyMenuItem&amp;gt;();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// Created by Sergey Malyan&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MenuManager&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; events&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; MenuClickedDel(MyMenuItem item);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;event&lt;/span&gt; MenuClickedDel MenuClicked;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; List&amp;lt;MenuItem&amp;gt; Build(List&amp;lt;MyMenuItem&amp;gt; itemsIn)&lt;br /&gt;        {&lt;br /&gt;            List&amp;lt;MenuItem&amp;gt; items = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;MenuItem&amp;gt;();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (MyMenuItem item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; itemsIn)&lt;br /&gt;            {&lt;br /&gt;                items.Add(Traverse(item));&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; items;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; MenuItem Traverse(MyMenuItem item)&lt;br /&gt;        {&lt;br /&gt;            MenuItem menu = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MenuItem();&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                menu.Header = item.Label;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (item.ImageIcon != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    item.ImageIcon.Width = item.ImageIcon.Height = 16;&lt;br /&gt;                    menu.Icon = item.ImageIcon;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (MyMenuItem item2 &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; item.DeeperItems)&lt;br /&gt;                {&lt;br /&gt;                    menu.Items.Add(Traverse(item2));&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                menu.Tag = item;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (item.DeeperItems.Count == 0)&lt;br /&gt;                {&lt;br /&gt;                    menu.Click += &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Windows.RoutedEventHandler(menu_Click);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; menu;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; menu_Click(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, System.Windows.RoutedEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            MyMenuItem item = ((MenuItem)sender).Tag &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; MyMenuItem;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (MenuClicked != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;                MenuClicked(item);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-6232508595379189796?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/6232508595379189796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/creating-menuitems-dynamically.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6232508595379189796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6232508595379189796'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/creating-menuitems-dynamically.html' title='Creating MenuItems dynamically'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_PoWFmfZWUBI/S7ucGBbNnkI/AAAAAAAAAIo/DL0b4h7BVYI/s72-c/image_thumb5.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-5397627350773813896</id><published>2010-04-01T09:09:00.000-07:00</published><updated>2010-10-13T09:09:54.022-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>how to instantiate a class from xml</title><content type='html'>&lt;p&gt;also known as xml deserialzing a class from a file.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_PoWFmfZWUBI/TLXZzZDlwSI/AAAAAAAAANE/-R1DsxZmYgM/s1600-h/image%5B10%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_PoWFmfZWUBI/TLXZ0cPXQWI/AAAAAAAAANI/7sjYmy-prgY/image_thumb%5B4%5D.png?imgmax=800" width="225" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;      &lt;p&gt;Feeded xml data has to match the fields. For reading in, see this &lt;a href="http://www.geekserg.com/2010/04/saving-class-instance-to-file.html"&gt;post&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-5397627350773813896?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/5397627350773813896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/how-to-instantiate-class-from-xml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5397627350773813896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5397627350773813896'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/how-to-instantiate-class-from-xml.html' title='how to instantiate a class from xml'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_PoWFmfZWUBI/TLXZ0cPXQWI/AAAAAAAAANI/7sjYmy-prgY/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-2552779298672668043</id><published>2010-04-01T09:02:00.000-07:00</published><updated>2010-10-13T09:05:37.554-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>saving class instance to a file</title><content type='html'>&lt;p&gt;also known as serializing a class to a file. &lt;/p&gt;  &lt;div class="csharpcode"&gt;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/TLXYontjUKI/AAAAAAAAAM8/GXgBqFaRTdk/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_PoWFmfZWUBI/TLXYpFNXW5I/AAAAAAAAANA/Ct8isF4x6J0/image_thumb%5B1%5D.png?imgmax=800" width="342" height="310" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;So. That’s it. Go check the file context for xml formatted data.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-2552779298672668043?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/2552779298672668043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/04/saving-class-instance-to-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2552779298672668043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2552779298672668043'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/04/saving-class-instance-to-file.html' title='saving class instance to a file'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_PoWFmfZWUBI/TLXYpFNXW5I/AAAAAAAAANA/Ct8isF4x6J0/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-488048014336291643</id><published>2010-02-01T12:17:00.000-08:00</published><updated>2010-05-04T13:18:42.190-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Best setup I Ever Encountered</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/02/best-setup-i-ever-encountered.html";digg_title = "Best setup I Ever Encountered";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" align="left" src="https://blogs.msdn.com/blogfiles/ukvsts/WindowsLiveWriter/TestingwithVisualStudioTeamSystem_BA7A/image_3.png" width="181" height="104" /&gt;&lt;/p&gt;  &lt;p&gt;Team Foundation Server&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;+&lt;/h1&gt;  &lt;p&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" alt="See full size image" align="left" src="http://t3.gstatic.com/images?q=tbn:CrMPEReM2mfJSM:http://www.viatechsoftware.com/images/code_review.jpg" /&gt;Code Reviews&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;+&lt;/h1&gt;  &lt;p&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" align="left" src="http://guy.dotnet-expertise.com/content/binary/DotNetFramework35.png" width="181" height="112" /&gt;.Net Technologies&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;+&lt;/h1&gt;  &lt;p&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" align="left" src="http://t2.gstatic.com/images?q=tbn:yFHiAlFJHXBnaM:http://edotnetdevs.files.wordpress.com/2009/05/image504.jpg" /&gt;Technical Discussions&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Seems these ingredients contribute to productivity and fun.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-488048014336291643?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/488048014336291643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/02/best-setup-i-ever-encountered.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/488048014336291643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/488048014336291643'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/02/best-setup-i-ever-encountered.html' title='Best setup I Ever Encountered'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-1145027161556493337</id><published>2010-01-22T18:35:00.000-08:00</published><updated>2010-05-25T16:37:21.561-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>Controlling Fonts in App</title><content type='html'>&lt;p&gt;You probably want to have a consistent settings for user controls in your WPF application, at least maybe a default set. Here is a basic example of how to keep Font, Size consistent for such basic controls as TextBlock and Label.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;strong&gt;App.xaml:&lt;/strong&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Application.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;Style &lt;/span&gt;&lt;span style="color: red"&gt;TargetType&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;TextBlock&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;BasedOn&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;{StaticResource {x:Type TextBlock}}&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Style.Setters&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;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;TextBlock.FontFamily&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;Calibri&lt;/span&gt;&amp;quot; &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;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;TextBlock.FontSize&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;Value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;11&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Style.Setters&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;span style="color: blue"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;That’s it. This style will jump up itself and initialize listed properties with values specified in this Application level resources. You can still overwrite them in the Forms xaml by explicitly defining them.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-1145027161556493337?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/1145027161556493337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/01/controlling-fonts-in-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/1145027161556493337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/1145027161556493337'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/01/controlling-fonts-in-app.html' title='Controlling Fonts in App'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-5993465058043056299</id><published>2009-12-14T16:48:00.000-08:00</published><updated>2010-03-31T17:48:59.333-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UnitTest'/><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio2008'/><title type='text'>InvalidComObjectException in UT</title><content type='html'>&lt;p&gt;If you are accessing COM server from UT in Visual Studio 2008 and get InvalidComObjectException exception. &lt;/p&gt;  &lt;p&gt;Then try changing your TestRunConfig.testrunconfig:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/S7PtefXKL6I/AAAAAAAAAH0/F6pfy3yZiJg/s1600-h/image3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_PoWFmfZWUBI/S7PteqygQOI/AAAAAAAAAH4/UcSyewBVlq0/image_thumb1.png?imgmax=800" width="406" height="135" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;add this line: &amp;lt;ExecutionThread apartmentState=&amp;quot;MTA&amp;quot; /&amp;gt; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-5993465058043056299?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/5993465058043056299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2009/12/invalidcomobjectexception-in-ut.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5993465058043056299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/5993465058043056299'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2009/12/invalidcomobjectexception-in-ut.html' title='InvalidComObjectException in UT'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_PoWFmfZWUBI/S7PteqygQOI/AAAAAAAAAH4/UcSyewBVlq0/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-7937057977406326871</id><published>2009-12-01T16:44:00.000-08:00</published><updated>2010-05-17T14:07:08.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>MSXML2.DOMDocument.selectNodes vs. XDocument.Descendants</title><content type='html'>&lt;strong&gt;OLD &lt;a href="http://en.wikipedia.org/wiki/MSXML"&gt;MSXML&lt;/a&gt; way:&lt;/strong&gt;&lt;br /&gt;MSXML2.DOMDocument xmlDoc = new MSXML2.DOMDocument();&lt;br /&gt;MSXML2.IXMLDOMNodeList xmlList = xmlDoc.documentElement.selectNodes("//MyNodeName”); &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;strong&gt;LINQ way:&lt;/strong&gt; &lt;br /&gt;XDocument xDoc = XDocument.Parse(batchXML); &lt;br /&gt;IEnumerable&amp;lt;XElement&amp;gt; commands = xDoc.&lt;strong&gt;Descendants&lt;/strong&gt;(&lt;strong&gt;XName.Get&lt;/strong&gt;(“MyNodeName”)); &lt;br /&gt;&lt;br /&gt;contactID = contactEl.&lt;b&gt;Attribute&lt;/b&gt;("conactID").Value;&lt;br /&gt;name = contactEl.&lt;b&gt;Element&lt;/b&gt;("FirstName").Value;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-7937057977406326871?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/7937057977406326871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2009/12/msxml2domdocumentselectnodes-vs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7937057977406326871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/7937057977406326871'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2009/12/msxml2domdocumentselectnodes-vs.html' title='MSXML2.DOMDocument.selectNodes vs. XDocument.Descendants'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-2325420208441675059</id><published>2009-10-31T17:47:00.000-07:00</published><updated>2010-03-31T17:47:55.868-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio2008'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Can’t Debug inside some Classes ?</title><content type='html'>&lt;p&gt;Most probably it does not enter into auto generated classes(AltovaXML classes, …). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_PoWFmfZWUBI/S7PtOeyQeJI/AAAAAAAAAHs/7YEihOrz4zU/s1600-h/image3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_PoWFmfZWUBI/S7PtO32yotI/AAAAAAAAAHw/2dO_dWHDPaY/image_thumb1.png?imgmax=800" width="351" height="211" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;OR&lt;/strong&gt; get rid of &lt;a href="http://msdn.microsoft.com/en-us/library/system.codedom.compiler.generatedcodeattribute.aspx"&gt;&lt;strong&gt;GeneratedCodeAttribute&lt;/strong&gt;&lt;/a&gt; attribute.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-2325420208441675059?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/2325420208441675059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2009/10/cant-debug-inside-some-classes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2325420208441675059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2325420208441675059'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2009/10/cant-debug-inside-some-classes.html' title='Can’t Debug inside some Classes ?'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_PoWFmfZWUBI/S7PtO32yotI/AAAAAAAAAHw/2dO_dWHDPaY/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-8165167323124976244</id><published>2009-10-04T17:45:00.000-07:00</published><updated>2010-03-31T17:45:56.061-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Implemeting IEnumerable&lt;T&gt;</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I always forget that there is something tricky when implementing templated IEnumerable.&lt;/p&gt;  &lt;p&gt;IEnumerable&amp;lt;T&amp;gt;inherits from IEnumerable which has another method to cover.&lt;/p&gt;  &lt;p&gt;So here is the example.&lt;/p&gt;  &lt;p&gt;public class Sites : IEnumerable&amp;lt;Site&amp;gt;    &lt;br /&gt;{ &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;IEnumerator IEnumerable.GetEnumerator() { return theSites.GetEnumerator(); }      &lt;br /&gt;&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160; public IEnumerator&amp;lt;Site&amp;gt; GetEnumerator() { return theSites.GetEnumerator(); }     &lt;br /&gt;} &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-8165167323124976244?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/8165167323124976244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2009/10/implemeting-ienumerable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/8165167323124976244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/8165167323124976244'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2009/10/implemeting-ienumerable.html' title='Implemeting IEnumerable&amp;lt;T&amp;gt;'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-6122459156462882435</id><published>2009-10-01T19:20:00.000-07:00</published><updated>2010-06-23T14:51:02.434-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Danger: Events</title><content type='html'>&lt;p&gt;Before C# era, there were no such things as Events. But there were callbacks, ugly stuff to use. And now with C#, there are Events, comfortable, easy to use, subscribe, get notified from server, define event, fire it easy.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" align="right" src="http://minimopar.knizefamily.net/images/timing-crank-int.jpg" width="179" height="185" /&gt;&lt;/p&gt;  &lt;p&gt;With C# there are 3 types of capabilities, class exposes: &lt;/p&gt;  &lt;p&gt;Methods, Properties and Events. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Events=Methods with some extra subscription. &lt;/p&gt;  &lt;p&gt;How do we decide, what Events are for and what Methods are for? More accurate question might be when to use Events and when Methods? The different between What and When might be the answer. Interested?&lt;/p&gt;  &lt;p&gt;I think that the intention of Events is to let Client know WHEN something is done. This is a feedback, a follow up after Client was told WHAT to do.&lt;/p&gt;  &lt;p&gt;And the intention of Methods is to let know Client WHAT to do.&lt;/p&gt;  &lt;p&gt;So I try to consider these factors when defining Event and Method.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-6122459156462882435?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/6122459156462882435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2009/10/danger-events.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6122459156462882435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6122459156462882435'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2009/10/danger-events.html' title='Danger: Events'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-2754020005151683519</id><published>2009-09-18T20:24:00.000-07:00</published><updated>2010-05-18T15:24:50.797-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XAML'/><title type='text'>Navigating data cheetlist</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2010/05/wpf-binding-cheetlist.html";digg_title = "Navigating data cheetlist";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;I’ll be adding here binding techniques that are useful and hard to remember. Happy navigating.&lt;/p&gt;  &lt;p&gt;&lt;img alt="Map of London GPS-Tracking by photo808." src="http://farm1.static.flickr.com/32/54362250_c8e46182a4.jpg" width="237" height="191" /&gt;&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="279"&gt;         &lt;h4&gt;XAML syntax&lt;/h4&gt;       &lt;/td&gt;        &lt;td valign="top" width="121"&gt;         &lt;h4&gt;binds to…&lt;/h4&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="279"&gt;{Binding}&lt;/td&gt;        &lt;td valign="top" width="121"&gt;&lt;em&gt;current context&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="279"&gt;{Binding User}&lt;/td&gt;        &lt;td valign="top" width="121"&gt;&lt;em&gt;context.User&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="279"&gt;{Binding User.FirstName}&lt;/td&gt;        &lt;td valign="top" width="121"&gt;&lt;em&gt;context.User.FirstName&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="279"&gt;{Binding ElementName=editBox2, Path=Text}&lt;/td&gt;        &lt;td valign="top" width="121"&gt;&lt;em&gt;“Text” property of XAML “editBox2” control&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="279"&gt;{Binding RelativeSource={RelativeSource Self}, Path=User}&lt;/td&gt;        &lt;td valign="top" width="121"&gt;&lt;em&gt;User property of the target element&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="279"&gt;{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyUserClass}}, Path=FirstName}&lt;/td&gt;        &lt;td valign="top" width="121"&gt;&lt;em&gt;going up in data tree until MyUserClass is met and going back down after FirstName.&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;More &lt;a href="http://www.scribd.com/doc/12923845/WPF-Binding-Cheatsheet"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-2754020005151683519?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/2754020005151683519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2010/05/wpf-binding-cheetlist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2754020005151683519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/2754020005151683519'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2010/05/wpf-binding-cheetlist.html' title='Navigating data cheetlist'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/32/54362250_c8e46182a4_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-8496570239992753135</id><published>2009-07-01T17:33:00.000-07:00</published><updated>2010-05-18T17:37:20.941-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>to dispose Form or not: Not</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://sergeymalyan.blogspot.com/2009/07/to-dispose-form-or-not-not.html";digg_title = "to dispose Form or not: Not";digg_bgcolor = "#EEEECC";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;ShowForm()    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;try     &lt;br /&gt;&amp;#160;&amp;#160; &lt;/span&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;MyForm &lt;/span&gt;form = &lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyForm &lt;/span&gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; form.ShowModal();&lt;/p&gt;  &lt;pre class="code"&gt;    }&lt;br /&gt;    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Exception&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;    }&lt;span style="color: blue"&gt;finally&lt;br /&gt;    &lt;/span&gt;{&lt;strike&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strike&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;strike&gt;form = null&lt;/strike&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;strike&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strike&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; or&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strike&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strike&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;strike&gt;&lt;font color="#ff0000"&gt;form.Dispose()&lt;/font&gt;&lt;/strike&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;strike&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strike&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I’ve seen that before. No need. Window.Close already disposes the form. And assigning the form to null might feel comfortable for C++ers but makes no difference in C# world. &lt;/p&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-8496570239992753135?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/8496570239992753135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2009/07/to-dispose-form-or-not-not.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/8496570239992753135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/8496570239992753135'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2009/07/to-dispose-form-or-not-not.html' title='to dispose Form or not: Not'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-254534009376227400.post-6189261287254136544</id><published>2009-05-14T17:46:00.000-07:00</published><updated>2010-03-31T17:47:10.835-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UnitTest'/><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio2008'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Creating Test Run Configuration</title><content type='html'>&lt;p&gt;Are you wondering where is my &lt;a href="http://msdn.microsoft.com/en-us/library/ms182480(VS.80).aspx"&gt;Test Run Configuration&lt;/a&gt;?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_PoWFmfZWUBI/S7PtCZXWt1I/AAAAAAAAAHU/nDYEfX-b7SI/s1600-h/image6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_PoWFmfZWUBI/S7PtCqfH5CI/AAAAAAAAAHc/OMgsVDLL0aU/image_thumb2.png?imgmax=800" width="244" height="111" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In order to create one, select solution, right click, create new item and this appears:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_PoWFmfZWUBI/S7PtDMGJbUI/AAAAAAAAAHg/KXulPsF8uMk/s1600-h/image3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_PoWFmfZWUBI/S7PtDf30nsI/AAAAAAAAAHk/K86ReyLRWUA/image_thumb1.png?imgmax=800" width="361" height="224" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;now you can create one.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/254534009376227400-6189261287254136544?l=www.geekserg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.geekserg.com/feeds/6189261287254136544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.geekserg.com/2009/05/creating-test-run-configuration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6189261287254136544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/254534009376227400/posts/default/6189261287254136544'/><link rel='alternate' type='text/html' href='http://www.geekserg.com/2009/05/creating-test-run-configuration.html' title='Creating Test Run Configuration'/><author><name>Him</name><uri>http://www.blogger.com/profile/12102911771654800067</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_PoWFmfZWUBI/S8ZWJAxF7PI/AAAAAAAAAJM/WY70PUVVRTM/S220/IconHook.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_PoWFmfZWUBI/S7PtCqfH5CI/AAAAAAAAAHc/OMgsVDLL0aU/s72-c/image_thumb2.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
