<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>Pavel&amp;#39;s Blog</title><link>http://blogs.microsoft.co.il/blogs/pavely/</link><description>&lt;h4&gt;Pavel is a software guy that is interested in almost everything&lt;br /&gt;
software related... way too much for too little time&lt;/h4&gt;</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PavelBlog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="pavelblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Windows Media Foundation: Controlling Camera Properties</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/05/19/windows-media-foundation-controlling-camera-properties.aspx</link><pubDate>Sat, 19 May 2012 20:05:52 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1096727</guid><dc:creator>pavely</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1096727</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1096727</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/05/19/windows-media-foundation-controlling-camera-properties.aspx#comments</comments><description>&lt;p&gt;I have &lt;a href="http://blogs.microsoft.co.il/blogs/pavely/archive/2011/03/07/introduction-to-windows-media-foundation.aspx" target="_blank"&gt;blogged&lt;/a&gt; about &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms696274(v=vs.85).aspx" target="_blank"&gt;Media Foundation&lt;/a&gt; before; it’s the “next generation” of &lt;a href="http://msdn.microsoft.com/en-us/library/aa930379" target="_blank"&gt;DirectShow&lt;/a&gt;, introduced in Windows Vista, enhanced in Windows 7 and further enhanced in Windows 8 (more on that in a future post). One of the tasks I encountered recently was to do a video capture from a camera. This is not too difficult to do (once you understand how Media Foundation works) and there’s even &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ee663604(v=vs.85).aspx" target="_blank"&gt;two sample&lt;/a&gt; in the SDK. But how do you control various camera properties, such as focus, zoom, white balance, etc.?&lt;/p&gt; &lt;p&gt;It turns out Media Foundation does not define any specific interfaces for these tasks. Curiously enough, it implements interfaces defined by its predecessor, DirectShow, on its media source (represented by the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms700189(v=vs.85).aspx" target="_blank"&gt;IMFMediaSource&lt;/a&gt; interface), when that media source is a video camera.&lt;/p&gt; &lt;p&gt;This means that all you need to do is use the usual &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms680573(v=vs.85).aspx" target="_blank"&gt;COM&lt;/a&gt; &lt;strong&gt;QueryInterface&lt;/strong&gt; on the media source to get to the relevant functionality, represented by (at least) two DirectShow-defined interfaces, &lt;a href="http://msdn.microsoft.com/en-us/library/aa929836.aspx" target="_blank"&gt;IAMCameraControl&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/dd376033(v=vs.85)" target="_blank"&gt;IAMVideoProcAmp&lt;/a&gt;. Here’s an example that sets some properties of a camera passed in as a media source:&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:ff6fa1fe-3b7e-4427-9def-b09286e476c5" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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;HRESULT CMFVideoCaptureDlg::SetupCamera(IMFMediaSource* pCameraSource) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    CComQIPtr&amp;lt;IAMCameraControl&amp;gt; spCameraControl(pCameraSource);&lt;/li&gt; &lt;li&gt;    HRESULT hr = S_OK;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(spCameraControl) {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;long&lt;/span&gt; min, max, step, def, control;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        hr = spCameraControl-&amp;gt;GetRange(CameraControl_Exposure, &amp;amp;min, &amp;amp;max, &amp;amp;step, &amp;amp;def, &amp;amp;control);&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(SUCCEEDED(hr))&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            hr = spCameraControl-&amp;gt;Set(CameraControl_Exposure, 1, CameraControl_Flags_Manual);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    CComQIPtr&amp;lt;IAMVideoProcAmp&amp;gt; spVideo(pCameraSource);&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(spVideo)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        hr = spVideo-&amp;gt;Set(VideoProcAmp_WhiteBalance, 0, VideoProcAmp_Flags_Auto);&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; hr;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The code uses ATL’s &lt;a href="http://msdn.microsoft.com/en-us/library/969CACB5-05B6-4AF4-B683-24911D70242D(v=vs.100,d=loband).aspx" target="_blank"&gt;CComQIPtr&amp;lt;&amp;gt;&lt;/a&gt; smart pointer class to do the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms682521(v=vs.85).aspx" target="_blank"&gt;QueryInterface&lt;/a&gt; more compactly.&lt;/p&gt; &lt;p&gt;Note that any such modifications may fail, because some properties are not supported by the individual camera or the camera driver. If you know your camera supports some functionality for sure, your best bet is to update the driver. Sometimes a generic camera driver is not enough and the vendor-specific driver is required.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1096727" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/COM/default.aspx">COM</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Win32/default.aspx">Win32</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Native+Development/default.aspx">Native Development</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Media+Foundation/default.aspx">Media Foundation</category></item><item><title>Windows 8: TopMost vs. TopMost</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/05/16/windows-8-topmost-vs-topmost.aspx</link><pubDate>Wed, 16 May 2012 06:54:54 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1093134</guid><dc:creator>pavely</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1093134</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1093134</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/05/16/windows-8-topmost-vs-topmost.aspx#comments</comments><description>&lt;p&gt;In Windows, a Window can be made topmost, by setting an extended style with the value &lt;a href="http://msdn.microsoft.com/EN-US/library/ff700543(VS.85).aspx" target="_blank"&gt;WS_EX_TOPMOST&lt;/a&gt; (8), typically provided to &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx" target="_blank"&gt;CreateWindowEx&lt;/a&gt;. A topmost window is always on top of non-topmost windows. Among all topmost windows, the normal z-order rules apply. That is, until Windows 8.&lt;/p&gt; &lt;p&gt;A Metro application is built with a topmost window – that makes perfect sense. What about desktop apps? Here’s an empty desktop snapped with a metro app (the desktop itself can be seen as a kind of metro app):&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/image_038AF3BB.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://blogs.microsoft.co.il/blogs/pavely/image_thumb_26F77253.png" width="547" height="343" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now let’s open &lt;strong&gt;Task Manager&lt;/strong&gt; and make it topmost (&lt;strong&gt;Options / Always On Top&lt;/strong&gt;). Slide it across the dividing snap bar and Task Manager is happy to be on top of the metro app:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/image_32ACB985.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://blogs.microsoft.co.il/blogs/pavely/image_thumb_26E74C86.png" width="546" height="342" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Curiously, clicking on the metro app window does not make Task Manager any less topmost. Now let’s open &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653" target="_blank"&gt;Process Explorer&lt;/a&gt; and make it topmost as well (&lt;strong&gt;Options / Always On Top&lt;/strong&gt;). Slide it over the metro app window, and this is the result:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/image_0AF6178E.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://blogs.microsoft.co.il/blogs/pavely/image_thumb_4F928C02.png" width="550" height="345" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It seems its topmost attribute is less powerful than Task Manager’s or the metro window! That’s certainly a surprise. It turns out Task Manager is “special” – I couldn’t find any other window that can stay on top of a metro app window – or on top of Task Manager for that matter.&lt;/p&gt; &lt;p&gt;Maybe Task Manager has a new “secret” style bit that makes it “super topmost”. Let’s open &lt;a href="http://msdn.microsoft.com/en-us/library/aa264396(v=VS.60).aspx" target="_blank"&gt;Spy++&lt;/a&gt; and select &lt;strong&gt;Spy / Find Window&lt;/strong&gt; from the menu:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/image_4C30F45A.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://blogs.microsoft.co.il/blogs/pavely/image_thumb_2A651BC9.png" width="331" height="308" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Dragging the “Finder Tool” over Task Manager’s main window and clicking ok, shows this in the Styles tab:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/image_5CE8793B.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://blogs.microsoft.co.il/blogs/pavely/image_thumb_2220D065.png" width="334" height="258" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The extended style is 0x108, which is &lt;strong&gt;WS_EX_TOPMOST&lt;/strong&gt; | &lt;strong&gt;WS_EX_WINDOWEDGE&lt;/strong&gt; – the latter being a minor appearance adjustment, irrelevant for our purposes. It looks like a regular WS_EX_TOPMOST. Let’s try the same with the Metro window.&lt;/p&gt; &lt;p&gt;Dragging the Finder Tool over the metro window “doesn’t stick” for some reason. Dragging Process Explorer’s equivalent tool manages to pinpoint the process to which this window belongs (&lt;strong&gt;WWAHost.exe&lt;/strong&gt;, meaning that app was written in HTML/JS), but it doesn’t give out the window handle. So, how can we get the window handle of that metro app?&lt;/p&gt; &lt;p&gt;I decided to try calling the simple &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms633558(v=vs.85).aspx" target="_blank"&gt;WindowFromPoint&lt;/a&gt; function, that I’m pretty sure Process Explorer uses as well (I was also sure Spy++ does that, though I can’t understand why it fails to see the window):&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:232871c4-973d-4b1d-9e98-1e1b3a08c0aa" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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="background:#ffffff;color:#2b91af;"&gt;POINT&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; pt = { 40, 40 };&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af;"&gt;HWND&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; h = ::WindowFromPoint(pt);&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;That worked. I got a handle and typed it into Spy++ handle text box. It turns out this window is a child window, so I navigated to its parent (that window’s name was “Store”) and finally to its parent with is the top level window. These are its properties:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/image_38FFA1E1.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://blogs.microsoft.co.il/blogs/pavely/image_thumb_374ED60D.png" width="351" height="271" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The only extended style is WS_EX_TOPMOST. How about Process Explorer’s window?&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/image_1516CA87.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://blogs.microsoft.co.il/blogs/pavely/image_thumb_5E596F82.png" width="355" height="275" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Pretty much the same. So they all have the same extended style bit (WS_EX_TOPMOST), but Task Manager and the Metro window behave as “super topmost” in relation to other topmost windows. Task Manager’s window seems to be the strongest topmost ever. So far, I don’t know how that is configured.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1093134" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Win32/default.aspx">Win32</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Native+Development/default.aspx">Native Development</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+Runtime/default.aspx">Windows Runtime</category></item><item><title>WPF Tip: Attached properties and bindings</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/05/12/wpf-tip-attached-properties-and-bindings.aspx</link><pubDate>Sat, 12 May 2012 19:04:07 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1090488</guid><dc:creator>pavely</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1090488</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1090488</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/05/12/wpf-tip-attached-properties-and-bindings.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/75928354-DC01-47E8-A018-8409AEC1F32D(v=vs.100,d=loband).aspx" target="_blank"&gt;Attached properties&lt;/a&gt; are a great way to extend capabilities of existing elements without the need to derive or otherwise tinker with those elements. Suppose we create an attached property that is a collection of objects of some particular kind. When that property changes, those objects are read, and that special functionality is applied. Here’s a hypothetical example of such a scheme:&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:63b2a064-4a21-42d4-896a-57077cc47f8c" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;SomeHelper&lt;/span&gt; {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DemoCollection&lt;/span&gt; GetData(&lt;span style="color:#0000ff;"&gt;DependencyObject&lt;/span&gt; obj) {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;DemoCollection&lt;/span&gt;)obj.GetValue(DataProperty);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; SetData(&lt;span style="color:#0000ff;"&gt;DependencyObject&lt;/span&gt; obj, &lt;span style="color:#0000ff;"&gt;DemoCollection&lt;/span&gt; value) {&lt;/li&gt; &lt;li&gt;        obj.SetValue(DataProperty, value);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DependencyProperty&lt;/span&gt; DataProperty =&lt;/li&gt; &lt;li&gt;         &lt;span style="color:#0000ff;"&gt;DependencyProperty&lt;/span&gt;.RegisterAttached(&lt;span style="color:#a31515;"&gt;&amp;quot;Data&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;DemoCollection&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;SomeHelper&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, OnDataChanged));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnDataChanged(&lt;span style="color:#0000ff;"&gt;DependencyObject&lt;/span&gt; obj, &lt;span style="color:#2b91af;"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; e) {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; coll = (&lt;span style="color:#0000ff;"&gt;DemoCollection&lt;/span&gt;)e.NewValue;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000;"&gt;// do something with collection&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; d &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; coll) {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;Trace&lt;/span&gt;.WriteLine(d.Text);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Demo&lt;/span&gt; : &lt;span style="color:#0000ff;"&gt;DependencyObject&lt;/span&gt; {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;)GetValue(TextProperty); }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; { SetValue(TextProperty, &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;); }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DependencyProperty&lt;/span&gt; TextProperty =&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;         &lt;span style="color:#0000ff;"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color:#a31515;"&gt;&amp;quot;Text&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Demo&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DemoCollection&lt;/span&gt; : &lt;span style="color:#0000ff;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;Demo&lt;/span&gt;&amp;gt; {&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;To summarize: The &lt;strong&gt;SomeHelper&lt;/strong&gt; class defines the &lt;strong&gt;Data&lt;/strong&gt; property which is of type &lt;strong&gt;DemoCollection&lt;/strong&gt;, which is a List of &lt;strong&gt;Demo&lt;/strong&gt; objects. The reason &lt;strong&gt;DemoCollection&lt;/strong&gt; is defined and the code doesn’t use &lt;strong&gt;List&amp;lt;Demo&amp;gt;&lt;/strong&gt; directly, is because WPF’s XAML does not support generics at this time. For each Demo object within the collection, its property &lt;strong&gt;Text&lt;/strong&gt; is printed using &lt;a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.trace.writeline.aspx" target="_blank"&gt;Trace.WriteLine&lt;/a&gt;. In a real application, this is where the special code would be.&lt;/p&gt; &lt;p&gt;Let’s use that in a simple scenario:&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:cc85793f-7d91-415b-975f-6c605fe28271" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&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;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SomeHelper.Data&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;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DemoCollection&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;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Demo&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Hello&amp;quot; /&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;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DemoCollection&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;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SomeHelper.Data&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;Grid&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;The “local” XML prefix points to the namespace and assembly where the above types are defined. In this case, we should see “Hello” traced out to the Visual Studio debugger when running with the debugger. No surprise there.&lt;/p&gt; &lt;p&gt;Now suppose the value of the &lt;strong&gt;Text&lt;/strong&gt; property is derived using data binding like so:&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:1889f70b-06f4-4fda-8206-821194452a6e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Demo&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; MyName}&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This indicates that Text should be bound to the &lt;strong&gt;MyName&lt;/strong&gt; property of the closest &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.datacontext.aspx" target="_blank"&gt;DataContext&lt;/a&gt; up the visual tree. Let’s set up the &lt;strong&gt;DataContext&lt;/strong&gt; to be the current Window and &lt;strong&gt;MyName&lt;/strong&gt; would be exposed through this window:&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:fe8a05a9-256c-497f-b365-96ac896cee53" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;MainWindow&lt;/span&gt; : &lt;span style="color:#0000ff;"&gt;Window&lt;/span&gt; {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; MainWindow() {&lt;/li&gt; &lt;li&gt;        InitializeComponent();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        DataContext = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; MyName {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Cactus&amp;quot;&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;When this is run, the expected output is “Cactus”. Surprisingly, the output is an empty string. The Visual Studio debugger outputs the following in the output window as a data binding error:&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:89a2682d-b01f-45ac-bb45-4000c2bb3430" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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:#ff0000;"&gt;System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=MyName; DataItem=null; target element is &amp;#39;Demo&amp;#39; (HashCode=48380239); target property is &amp;#39;Text&amp;#39; (type &amp;#39;String&amp;#39;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;It seems the &lt;strong&gt;DataContext&lt;/strong&gt; didn’t “stick”: The message claims that &lt;strong&gt;DataItem=null&lt;/strong&gt;, meaning there is no source for the binding, and so it fails.&lt;/p&gt; &lt;p&gt;If we try something even simpler, such as binding to a named element, such as the window itself with a well known property like this:&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:6172b4bd-94e7-48ea-9099-91889e5f978b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;local&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Demo&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; ActualWidth&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;,&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ElementName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=win}&amp;quot; /&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;(the window is named “win”). Again nothing appears, and the debugger output claims:&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:2b6caa18-7a40-464d-a669-91d0450cedcc" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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:#ff0000;"&gt;System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=ActualWidth; DataItem=null; target element is &amp;#39;Demo&amp;#39; (HashCode=63379435); target property is &amp;#39;Text&amp;#39; (type &amp;#39;String&amp;#39;)&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Same result. What’s going on? Can’t we use any binding in this case?&lt;/p&gt; &lt;p&gt;The problem is a bit subtle. A &lt;strong&gt;DataContext&lt;/strong&gt; or any element for that matter cannot be found because there is no “WPF&amp;quot; parent” around. The &lt;strong&gt;Demo&lt;/strong&gt;’s instance parent is the &lt;strong&gt;DemoCollection&lt;/strong&gt; object, which knows nothing about WPF and so has no way of knowing who is its “parent” in the visual tree.&lt;/p&gt; &lt;p&gt;Are we doomed? Fortunately, there is a way to fix this. We need to work with an object that is more “WPF aware” than a simple &lt;strong&gt;List&amp;lt;&amp;gt;&lt;/strong&gt;. The next best thing is &lt;a href="http://msdn.microsoft.com/en-us/library/aa346595.aspx" target="_blank"&gt;FreezableCollection&amp;lt;T&amp;gt;&lt;/a&gt;. This can hold any object derived from &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.aspx" target="_blank"&gt;DependencyObject&lt;/a&gt;, but &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.freezable.aspx" target="_blank"&gt;Freezable&lt;/a&gt; is preferred, and in this case, required; &lt;strong&gt;Freezable&lt;/strong&gt; is an interesting class in itself, but this is beyond the scope of this post and it doesn’t matter in this case. We don’t need the special aspects of &lt;strong&gt;Freezable&lt;/strong&gt;, we just need its awareness of being part of the WPF world.&lt;/p&gt; &lt;p&gt;We need to make two changes. The first, in the collection:&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:a38ec04b-2115-4981-9327-c639beae0917" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DemoCollection&lt;/span&gt; : &lt;span style="color:#0000ff;"&gt;FreezableCollection&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;Demo&lt;/span&gt;&amp;gt; {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The other is making sure or &lt;strong&gt;Demo&lt;/strong&gt; class is indeed a &lt;strong&gt;Freezable&lt;/strong&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:daf53953-3b65-48c6-b1a5-30c57a22ec4e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Demo&lt;/span&gt; : &lt;span style="color:#0000ff;"&gt;Freezable&lt;/span&gt; {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Text {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;)GetValue(TextProperty); }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; { SetValue(TextProperty, &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;); }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;DependencyProperty&lt;/span&gt; TextProperty =&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;         &lt;span style="color:#0000ff;"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color:#a31515;"&gt;&amp;quot;Text&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;Demo&lt;/span&gt;), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Freezable&lt;/span&gt; CreateInstanceCore() {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;NotImplementedException&lt;/span&gt;();&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;This forces us to implement the abstract &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.freezable.createinstancecore.aspx" target="_blank"&gt;CreateInstanceCore&lt;/a&gt; from Freezable, but that doesn’t matter in this case, because it will not be created by the &lt;strong&gt;Freezable&lt;/strong&gt; cloning mechanism. In any case, implementing it is typically done by calling the &lt;strong&gt;new &lt;/strong&gt;operator with the default constructor of the current type.&lt;/p&gt; &lt;p&gt;That’s it. Now binding works as expected in all scenarios.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1090488" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Win32 and Metro–CreateFile(2)</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/05/03/win32-and-metro-createfile-2.aspx</link><pubDate>Thu, 03 May 2012 10:05:31 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1081604</guid><dc:creator>pavely</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1081604</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1081604</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/05/03/win32-and-metro-createfile-2.aspx#comments</comments><description>&lt;p&gt;When a new Windows version comes out, I’m always curious about the new &lt;a href="http://en.wikipedia.org/wiki/Windows_API" target="_blank"&gt;Windows API&lt;/a&gt; (Win32) functions that are added to the release.&lt;/p&gt; &lt;p&gt;With Windows 8, things get a little more complicated, as there are desktop apps and there are metro apps. Now, for every Windows API function the documentation states whether this API is valid for desktop apps only or for desktop apps and metro apps.&lt;/p&gt; &lt;p&gt;One classic function is &lt;a href="http://msdn.microsoft.com/EN-US/library/aa363858(VS.85).aspx" target="_blank"&gt;CreateFile&lt;/a&gt;. This is one of the oldest functions – exists since the very first Windows NT version. In Windows 8, it’s marked for desktop apps only. This may be understandable, as the &lt;a href="http://en.wikipedia.org/wiki/Windows_Runtime" target="_blank"&gt;Windows Runtime&lt;/a&gt; has other ways to use files, such as the &lt;a href="http://msdn.microsoft.com/EN-US/library/br227171(VS.10).aspx" target="_blank"&gt;StorageFile&lt;/a&gt; class. However, Windows 8 has a new function called &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/hh449422%28v=vs.85%29.aspx" target="_blank"&gt;CreateFile2&lt;/a&gt;. This one, in contrast to &lt;strong&gt;CreateFile&lt;/strong&gt;, can be used in desktop and metro apps. Here’s its prototype:&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:941acbac-f41e-47ac-a39c-78b3d7db0dc5" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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;HANDLE WINAPI CreateFile2(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  _In_      LPCWSTR lpFileName,&lt;/li&gt; &lt;li&gt;  _In_      DWORD dwDesiredAccess,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  _In_      DWORD dwShareMode,&lt;/li&gt; &lt;li&gt;  _In_      DWORD dwCreationDisposition,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  _In_opt_  LPCREATEFILE2_EXTENDED_PARAMETERS pCreateExParams&lt;/li&gt; &lt;li&gt;);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;Here’s the prototype of &lt;strong&gt;CreateFile&lt;/strong&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:d5598648-77f1-4e96-98af-98546b0f1402" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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;HANDLE WINAPI CreateFile(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  __in      LPCTSTR lpFileName,&lt;/li&gt; &lt;li&gt;  __in      DWORD dwDesiredAccess,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  __in      DWORD dwShareMode,&lt;/li&gt; &lt;li&gt;  __in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  __in      DWORD dwCreationDisposition,&lt;/li&gt; &lt;li&gt;  __in      DWORD dwFlagsAndAttributes,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  __in_opt  HANDLE hTemplateFile&lt;/li&gt; &lt;li&gt;);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The first four arguments of &lt;strong&gt;CreateFile2&lt;/strong&gt; exist in both &lt;strong&gt;CreateFile &lt;/strong&gt;and &lt;strong&gt;CreateFile2&lt;/strong&gt;. The new extended parameters structure of &lt;strong&gt;CreateFile2&lt;/strong&gt; simply packages the “missing” arguments into an single optional structure:&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:fcef97f2-fcad-48c8-b10b-3545e5f0f446" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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;typedef struct _CREATEFILE2_EXTENDED_PARAMETERS {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  DWORD                 dwSize;&lt;/li&gt; &lt;li&gt;  DWORD                 dwFileAttributes;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  DWORD                 dwFileFlags;&lt;/li&gt; &lt;li&gt;  DWORD                 dwSecurityQosFlags;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  LPSECURITY_ATTRIBUTES lpSecurityAttributes;&lt;/li&gt; &lt;li&gt;  HANDLE                hTemplateFile;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;} CREATEFILE2_EXTENDED_PARAMETERS, *PCREATEFILE2_EXTENDED_PARAMETERS, *LPCREATEFILE2_EXTENDED_PARAMETERS;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This structure actually adds nothing to what &lt;strong&gt;CreateFile&lt;/strong&gt; can specify. The &lt;strong&gt;dwFlagsAndAttributes&lt;/strong&gt; of &lt;strong&gt;CreateFile&lt;/strong&gt; is logically split to three groups of flags represented by &lt;strong&gt;dwFileAttributes&lt;/strong&gt;, &lt;strong&gt;dwFileFlags&lt;/strong&gt; and &lt;strong&gt;dwSecurityQosFlags&lt;/strong&gt; in this structure for &lt;strong&gt;CreateFile2&lt;/strong&gt;. Although the split is a good thing, it doesn’t explain why &lt;strong&gt;CreateFile&lt;/strong&gt; is forbidden in metro style apps. Furthermore, the documentation for &lt;strong&gt;CreateFile2&lt;/strong&gt; states that in metro apps this function can only open files and directories (and not things like pipes, mailslots, consoles, etc.). &lt;/p&gt; &lt;p&gt;So why is &lt;strong&gt;CreateFile&lt;/strong&gt; forbidden in metro apps? Perhaps it does allow opening something that &lt;strong&gt;CreateFile2&lt;/strong&gt; forbids?&lt;/p&gt; &lt;p&gt;I decided to try calling it from a metro app. Trying to just use &lt;strong&gt;CreateFile&lt;/strong&gt; would not compile, as a set of &lt;strong&gt;#ifdef/#endif&lt;/strong&gt; is placed inside the Windows headers to prevent compiling a forbidden API. This, however, can be circumvented easily. We can just create the correct prototype manually:&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:3f6726e1-d668-4877-96e7-efa7a2b2fb12" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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="background:#ffffff;color:#0000ff;"&gt;extern&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;HANDLE WINAPI CreateFileW(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;__in      LPCTSTR lpFileName,&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;__in      DWORD dwDesiredAccess,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;__in      DWORD dwShareMode,&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;__in_opt  LPSECURITY_ATTRIBUTES lpSecurityAttributes,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;__in      DWORD dwCreationDisposition,&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;__in      DWORD dwFlagsAndAttributes,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000;"&gt;__in_opt  HANDLE hTemplateFile&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;This is just the &lt;strong&gt;CreateFile&lt;/strong&gt; declaration from the docs wrapped in an &lt;strong&gt;extern “C”&lt;/strong&gt; declaration; this is important, otherwise the liker would complain of an unresolved external (trying to look for C++ linkage). Also, note the function is declared as &lt;strong&gt;CreateFileW&lt;/strong&gt; (the Unicode version) and not simply &lt;strong&gt;CreateFile&lt;/strong&gt;, as &lt;strong&gt;CreateFile&lt;/strong&gt; is actually a macro, and would not have been found by the linker.&lt;/p&gt; &lt;p&gt;Let’s add a simple call to this &lt;strong&gt;CreateFileW&lt;/strong&gt; in a blank C++ metro style application in the BlankWindow constructor:&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:c523e568-5181-48d1-8ab8-45220af127fb" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&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="background:#ffffff;color:#000000;"&gt;HANDLE h = ::CreateFileW(L&lt;/span&gt;&lt;span style="background:#ffffff;color:#800000;"&gt;&amp;quot;C:&amp;#92;&amp;#92;Users&amp;#92;&amp;#92;Pavel&amp;#92;&amp;#92;Documents&amp;#92;&amp;#92;test.txt&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;nullptr&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;, OPEN_EXISTING, 0, 0);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;(h == INVALID_HANDLE_VALUE) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;auto&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt; err = ::GetLastError();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff;"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000;"&gt;::CloseHandle(h);&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This code tries to open a text file. This fails with error code 5 (access denied), as does CreateFile2. Although I set up the manifest with access to the documents library and set up a TXT file association, it refuses to work.&lt;/p&gt; &lt;p&gt;There doesn’t seem to be a noticeable difference between &lt;strong&gt;CreateFile&lt;/strong&gt; and &lt;strong&gt;CreateFile2&lt;/strong&gt;. I don’t understand at this time why CreateFile2 exists, apart from the convenience of that extra optional structure. There’s a room for further investigation, perhaps looking at &lt;strong&gt;NtDll.dll&lt;/strong&gt; to see if these call different system services (unlikely, but worth a check).&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1081604" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/COM/default.aspx">COM</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Win32/default.aspx">Win32</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Native+Development/default.aspx">Native Development</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+Runtime/default.aspx">Windows Runtime</category></item><item><title>WPF 4.5 Cookbook</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/04/26/wpf-4-5-cookbook.aspx</link><pubDate>Thu, 26 Apr 2012 16:40:44 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1075712</guid><dc:creator>pavely</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1075712</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1075712</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/04/26/wpf-4-5-cookbook.aspx#comments</comments><description>&lt;p&gt;A few months back, I was approached by &lt;a href="http://www.packtpub.com/" target="_blank"&gt;Packt publishing&lt;/a&gt;, asking me to write a WPF book, in their “cookbook” style, and I accepted. I haven’t written an entire book before, but I have written dozen of courses for Hi-Tech College, &lt;a href="http://www.johnbryce.co.il/" target="_blank"&gt;John Bryce Training&lt;/a&gt; and now for &lt;a href="http://www.codevalue.net/" target="_blank"&gt;CodeValue&lt;/a&gt;, in a range of topics, from Windows Internals and device driver development, to advanced C++, to basic and advanced .NET topics, to WPF, and even some oddities such as the &lt;a href="http://college.codevalue.net/course/programming-the-windows-media-foundation" target="_blank"&gt;Windows Media Foundation&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Writing a book, however, is different than writing a course, and I was at least curious whether I could produce something useful, given that WPF is not new and has already several decent books out there. So, what’s special about this book? First, it doesn’t target the absolute beginner, although I do cover most of WPF fundamentals in the first two chapters, but is more oriented towards the intermediate WPF developer, and sometimes a bit higher than that (or so I hope). Second, I do expect this “cookbook” style, where recipes to common problems are presented, followed by explanations and expansions, to feel a somewhat different experience, where dependencies among recipes are almost non-existent (and we all know dependencies are bad &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://blogs.microsoft.co.il/blogs/pavely/wlEmoticon-smile_195021F9.png" /&gt;).&lt;/p&gt; &lt;p&gt;And third, I ‘m reminded by an interview I read a few years back with &lt;a href="http://en.wikipedia.org/wiki/Dino_Esposito" target="_blank"&gt;Dino Esposito&lt;/a&gt;, who told the following story about himself: He was to give a session in a conference about &lt;a href="http://en.wikipedia.org/wiki/Component_Object_Model" target="_blank"&gt;COM&lt;/a&gt; (Component Object Model). Before that session started, he noticed &lt;a href="http://en.wikipedia.org/wiki/Don_Box" target="_blank"&gt;Don Box&lt;/a&gt; (then the ultimate guru of COM) sitting down in the first row to listen. Dino walked up to him and asked why is he here? Surely, there’s nothing new Dino can teach Don Box about COM. Don Box replied, “It’s all about perspective”. Well, this is my perspective on WPF.&lt;/p&gt; &lt;p&gt;According to the publisher, the book must be around 300 pages. This is pretty low for WPF, as WPF is huge, so I had to cut down some topics, to make sure I’m covering the major WPF pillars. Eventually, I expect to be at around 350 pages.&lt;/p&gt; &lt;p&gt;The book includes 11 chapters, 6 of which I’ve already written (without incorporating technical reviewers’ comments):&lt;/p&gt; &lt;h3&gt;1. Foundations&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/h3&gt; &lt;h3&gt;2. Resources&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/h3&gt; &lt;h3&gt;3. Layout and Panels&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/h3&gt; &lt;h3&gt;4. Using Standard Controls&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/h3&gt; &lt;h3&gt;5. Application and Windows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/h3&gt; &lt;h3&gt;6. Data Binding&lt;/h3&gt; &lt;h3&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7. Commands and MVVM&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/h3&gt; &lt;h3&gt;8. Styles, Triggers &amp;amp; Templates&lt;/h3&gt; &lt;h3&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9. Graphics &amp;amp; Animation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;/h3&gt; &lt;h3&gt;10. Custom Elements&lt;/h3&gt; &lt;h3&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11. Threading&lt;/h3&gt; &lt;p&gt;The expected publication date (if all goes well) is around August. &lt;p&gt;The book official page is at &lt;a title="http://www.packtpub.com/windows-presentation-foundation-4-5-cookbook/book" href="http://www.packtpub.com/windows-presentation-foundation-4-5-cookbook/book"&gt;http://www.packtpub.com/windows-presentation-foundation-4-5-cookbook/book&lt;/a&gt; &lt;p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1075712" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_+5.0/default.aspx">C# 5.0</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Visual+Studio+11/default.aspx">Visual Studio 11</category></item><item><title>Windows Devices UG Meeting Reminder: WinRT &amp; Metro Apps</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/04/17/windows-devices-ug-meeting-reminder-winrt-amp-metro-apps.aspx</link><pubDate>Tue, 17 Apr 2012 15:31:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1067473</guid><dc:creator>pavely</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1067473</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1067473</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/04/17/windows-devices-ug-meeting-reminder-winrt-amp-metro-apps.aspx#comments</comments><description>&lt;p&gt;The Windows Devices user group managed by &lt;a href="http://blogs.microsoft.co.il/blogs/eshaham/" target="_blank"&gt;Elad Shaham&lt;/a&gt; and myself is meeting next Tuesday (the 24th) at Microsoft Offices in Ra’anana. We’ll have two sessions dedicated to Windows 8. &lt;/p&gt; &lt;p&gt;Full agenda and registration (free) is available at &lt;a href="http://insidewindowsruntime.eventbrite.com/"&gt;http://insidewindowsruntime.eventbrite.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;See you there!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1067473" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4/default.aspx">.NET 4</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+Devices+User+Group/default.aspx">Windows Devices User Group</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+Runtime/default.aspx">Windows Runtime</category></item><item><title>WPF 4.5: Markup Extension for Events</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/04/07/wpf-4-5-markup-extension-for-events.aspx</link><pubDate>Sat, 07 Apr 2012 15:34:25 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1057413</guid><dc:creator>pavely</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1057413</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1057413</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/04/07/wpf-4-5-markup-extension-for-events.aspx#comments</comments><description>&lt;p&gt;One of the new features coming in WPF 4.5 (already available through the &lt;a href="http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&amp;amp;l=en-US&amp;amp;k=k(MSDNSTART)&amp;amp;rd=true" target="_blank"&gt;Visual Studio 11 Beta&lt;/a&gt; and .NET 4.5 Beta) is the ability to create markup extensions that work on events (as opposed to properties, which have always had this capability).&lt;/p&gt; &lt;p&gt;Markup extensions for properties are crucial, and there are quite a few useful ones, such as &lt;a href="http://msdn.microsoft.com/en-us/library/ms750413.aspx" target="_blank"&gt;{Binding&lt;/a&gt;} and &lt;a href="http://msdn.microsoft.com/en-us/library/ms750950.aspx" target="_blank"&gt;{StaticResource}&lt;/a&gt;. Would this ability be useful for events?&lt;/p&gt; &lt;p&gt;One such case is when a command is needed to be invoked (&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx" target="_blank"&gt;ICommand&lt;/a&gt;) because of some event, typically found in MVVM scenarios. The problem is that only some events can actually trigger a command (out of the box) such as &lt;strong&gt;Click&lt;/strong&gt; for &lt;strong&gt;ButtonBase &lt;/strong&gt;and &lt;strong&gt;Click &lt;/strong&gt;for &lt;strong&gt;MenuItem&lt;/strong&gt;. What about other events? What about other elements that don’t implement &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommandsource.aspx" target="_blank"&gt;ICommandSource&lt;/a&gt; and therefore have no &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommandsource.command.aspx" target="_blank"&gt;Command&lt;/a&gt; property to connect to?&lt;/p&gt; &lt;p&gt;This is where a markup extension for events can come in handy. The solutions so far to this issue usually involved using the Interactivity assembly from the &lt;a href="http://msdn.microsoft.com/en-us/library/dd440764.aspx" target="_blank"&gt;Expression Blend SDK&lt;/a&gt;, that provides actions, triggers and behaviors, one of which provides a way to invoke a command (&lt;a href="http://msdn.microsoft.com/en-us/library/ff724018(v=Expression.40).aspx" target="_blank"&gt;InvokeCommandAction&lt;/a&gt;). We can try to do something similar using the new feature, which will not require the Blend SDK at all.&lt;/p&gt; &lt;h2&gt;How to use it&lt;/h2&gt; &lt;p&gt;Let’s look at the usage first. Consider a simple paining program the draws lines on a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.canvas.aspx" target="_blank"&gt;Canvas&lt;/a&gt;. We want to handle a mouse down, move and up events in the ViewModel (as opposed to the view). This decouples things, and provides command objects that can later be used to manage (e.g.) undo/redo features. Here’s how the Canvas markup should look like:&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:6d7fb48a-2aff-400a-8e2b-6070b38b4914" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;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="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#a31515;"&gt;Canvas&lt;/span&gt;&lt;span style="background:#fffbf0;color:#ff0000;"&gt; ClipToBounds&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#ff0000;"&gt; Background&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;=&amp;quot;White&amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;       &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#ff0000;"&gt; MouseLeftButtonDown&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="background:#fffbf0;color:#a31515;"&gt;local&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="background:#fffbf0;color:#a31515;"&gt;EventToCommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#ff0000;"&gt; StartPaintCommand}&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;       &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#ff0000;"&gt; MouseMove&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="background:#fffbf0;color:#a31515;"&gt;local&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="background:#fffbf0;color:#a31515;"&gt;EventToCommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#ff0000;"&gt; AddLineCommand}&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt; &lt;span style="background:#fffbf0;color:#000000;"&gt;                           &lt;/span&gt;&lt;span style="background:#fffbf0;color:#ff0000;"&gt; MouseLeftButtonUp&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="background:#fffbf0;color:#a31515;"&gt;local&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;:&lt;/span&gt;&lt;span style="background:#fffbf0;color:#a31515;"&gt;EventToCommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#ff0000;"&gt; EndPaintCommand}&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="background:#fffbf0;color:#a31515;"&gt;Canvas&lt;/span&gt;&lt;span style="background:#fffbf0;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;The markup extension constructor is interpreted as a property path to bind to (relative to the current &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.datacontext.aspx" target="_blank"&gt;DataContext&lt;/a&gt;). At first, it seems easier to add a &lt;strong&gt;Command &lt;/strong&gt;property (of type &lt;strong&gt;ICommand&lt;/strong&gt;) to the markup extension (and I did) , but it’s really useful; that’s because it’s not possible to provide a &lt;strong&gt;{Binding}&lt;/strong&gt; expression as the value of that property. To do that we’d have to turn the &lt;strong&gt;Command&lt;/strong&gt; property to a dependency property – but we can’t because &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.markup.markupextension.aspx" target="_blank"&gt;MarkupExtension&lt;/a&gt; does not derive from &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.aspx" target="_blank"&gt;DependencyObject&lt;/a&gt; &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-sadsmile" alt="Sad smile" src="http://blogs.microsoft.co.il/blogs/pavely/wlEmoticon-sadsmile_777959FB.png" /&gt;&lt;/p&gt; &lt;p&gt;The solution I used was to declare a &lt;strong&gt;BindingCommandPath&lt;/strong&gt; property (or via the constructor), that interprets the property path as a binding path (this is the most common scenario). A helper method digs into the property path and gets the actual value:&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:72b3cafb-3393-419c-b484-c6e8f132c37b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;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="background:#fffbf0;color:#0000ff;"&gt;static&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; ParsePropertyPath(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; target, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; path) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; props = path.Split(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#800000;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; prop &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;in&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; props) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;target = target.GetType().GetProperty(prop).GetValue(target);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; target;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;This little method does not support indexing, but that is not commonly used, and in any case wouldn’t be too hard to add.&lt;/p&gt; &lt;h2&gt;Creating a markup extension&lt;/h2&gt; &lt;p&gt;Writing a markup extension for events is fundamentally no different than writing it for properties. The first thing is to create a class deriving from &lt;strong&gt;MarkupExtension&lt;/strong&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:fe488e04-0938-412e-b88e-c6223fae4732" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;sealed&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;EventToCommandExtension&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;MarkupExtension&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The main thing to do is implement the abstract &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.markup.markupextension.providevalue.aspx" target="_blank"&gt;ProvideValue&lt;/a&gt; method. This should return something appropriate – in an event case, a delegate object appropriate for the event’s delegate type.&lt;/p&gt;   &lt;p&gt;A command can receive a parameter – in this case it would probably want the sender and the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.routedeventargs.aspx" target="_blank"&gt;RoutedEventArgs&lt;/a&gt;-derived type. For this a created a simple generic class:&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:742e6904-d1f2-4cdf-b272-1a8212ee2be1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;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="background:#fffbf0;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;sealed&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;class&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;EventCommandArgs&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;TEventArgs&amp;gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;where&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; TEventArgs : &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;RoutedEventArgs&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; TEventArgs EventArgs { &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; Sender { &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;private&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;set&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; EventCommandArgs(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; sender, TEventArgs args) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;Sender = sender;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;EventArgs = args;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Now for the main event: overriding &lt;strong&gt;ProvideValue&lt;/strong&gt;. Here we need to return an alternative (our own) handler, that will invoke the required command. First, let’s get the service that provides some context for the markup extension usage:&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:594500ff-142e-4cfd-b0a9-b02c05021ab4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;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="background:#fffbf0;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;override&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; ProvideValue(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;IServiceProvider&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; sp) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; pvt = sp.GetService(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;IProvideValueTarget&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;)) &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;as&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;IProvideValueTarget&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;Now we can examine the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.markup.iprovidevaluetarget.targetproperty.aspx" target="_blank"&gt;TargetProperty&lt;/a&gt; property to get the actual event object. Curiously enough, it’s sometimes an &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.eventinfo.aspx" target="_blank"&gt;EventInfo&lt;/a&gt; (which is expected), but sometimes it’s a &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.methodinfo.aspx" target="_blank"&gt;MethodInfo&lt;/a&gt;. So we need to deal with the difference and eventually connect to our own handler, called &lt;strong&gt;DoAction&lt;/strong&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:106721de-1bc2-4c42-943e-7dfdbf122e80" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;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="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(pvt != &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; evt = pvt.TargetProperty &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;as&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;EventInfo&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; doAction = GetType().GetMethod(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#800000;"&gt;&amp;quot;DoAction&amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;BindingFlags&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;.NonPublic | &lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;BindingFlags&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;.Instance);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;Type&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; dlgType = &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(evt != &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;dlgType = evt.EventHandlerType;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; mi = pvt.TargetProperty &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;as&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;MethodInfo&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(mi != &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;dlgType = mi.GetParameters()[1].ParameterType;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(dlgType != &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;_eventArgsType = dlgType.GetMethod(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#800000;"&gt;&amp;quot;Invoke&amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;).GetParameters()[1].ParameterType;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;Delegate&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;.CreateDelegate(dlgType, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;this&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;, doAction);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The trick is to create the exact delegate type (it’s &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.routedeventhandler.aspx" target="_blank"&gt;RoutedEventHandler&lt;/a&gt; or something more specific – we need that specificity to make the command implementor itself simpler and type safe; more on that in a moment. That’s why we create the delegate dynamically with &lt;a href="http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx" target="_blank"&gt;Delegate.CreateDelegate&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In our &lt;strong&gt;DoAction&lt;/strong&gt; method, we need to invoke the connected command correctly:&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:0d042fd8-a66a-4525-a81b-4d22c2f9701e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;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="background:#fffbf0;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; DoAction(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;object&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; sender, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;RoutedEventArgs&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; e) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; dc = (sender &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;as&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;FrameworkElement&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;).DataContext;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(BindingCommandPath != &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;Command = (&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;ICommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;)ParsePropertyPath(dc, BindingCommandPath);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;Type&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; eventArgsType = &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;EventCommandArgs&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&amp;gt;).MakeGenericType(_eventArgsType);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; cmdParams = &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;Activator&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;.CreateInstance(eventArgsType, sender, e);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(Command != &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;null&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &amp;amp;&amp;amp; Command.CanExecute(cmdParams))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;Command.Execute(cmdParams);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&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;Again, because we don’t know in advance what kind of &lt;strong&gt;EventArgs&lt;/strong&gt; are actually used by that particular event, we create the &lt;strong&gt;EventCommandArgs&lt;/strong&gt; generic type dynamically, by first creaing the “open” type (with no specific generic parameter) and then calling &lt;a href="http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx" target="_blank"&gt;MakeGenericType&lt;/a&gt; to make it a creatable “closed” type. Then we call &lt;strong&gt;ICommand.Execute&lt;/strong&gt; if &lt;strong&gt;ICommand.CanExecute&lt;/strong&gt; returns true.&lt;/p&gt; &lt;h2&gt;Implementing the commands&lt;/h2&gt; &lt;p&gt;The &lt;strong&gt;PaintingViewModel&lt;/strong&gt; class implements the three commands shown above. Here’s the command to start painting:&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:f0e1f270-623e-489a-9f5c-b09590806524" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;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="background:#fffbf0;color:#0000ff;"&gt;bool&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; _isPainting;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;ICommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; _startPaintCommand;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;ICommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; StartPaintCommand {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; _startPaintCommand ?? (_startPaintCommand = &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;RelayCommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;EventCommandArgs&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;MouseButtonEventArgs&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt;&amp;gt;(args =&amp;gt; {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; element = args.Sender &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;as&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;IInputElement&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;_lastPoint = args.EventArgs.GetPosition(element);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;element.CaptureMouse();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;_isPainting = &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;true&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;}));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;&lt;strong&gt;RelayCommand&amp;lt;&amp;gt;&lt;/strong&gt; is the typical command used in MVVM scenarios (look at the source code). It’s sometimes called &lt;strong&gt;DelegateCommand&lt;/strong&gt; (available in &lt;a href="http://compositewpf.codeplex.com/" target="_blank"&gt;Prism&lt;/a&gt;, but they’re similar).&lt;/p&gt; &lt;p&gt;Here’s the command bound to a mouse move event:&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:d1d9788f-c5fd-47a9-9e9e-7c57e0e00295" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;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="background:#fffbf0;color:#000080;"&gt;ICommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; _addLineCommand;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;public&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;ICommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; AddLineCommand {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;get&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; _addLineCommand ?? (_addLineCommand = &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;RelayCommand&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;EventCommandArgs&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;MouseEventArgs&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt;&amp;gt;(args =&amp;gt; {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; element = args.Sender &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;as&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#000080;"&gt;IInputElement&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;var&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; pt = args.EventArgs.GetPosition(element);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;Model.AddLine(_lastPoint, pt);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;_lastPoint = pt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;}, args =&amp;gt; _isPainting&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The &lt;strong&gt;Model&lt;/strong&gt; property is of type &lt;strong&gt;Paining&lt;/strong&gt; that holds a collection of &lt;strong&gt;LineInfo&lt;/strong&gt; objects. Again, look at the source.&lt;/p&gt; &lt;p&gt;Here’s a view at runtime:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/image_04733A0D.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://blogs.microsoft.co.il/blogs/pavely/image_thumb_42F887B3.png" width="277" height="225" /&gt;&lt;/a&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:fb3a1972-4489-4e52-abe7-25a00bb07fdf:ca2ec207-85b1-4b1c-b220-50d7c1775c38" class="wlWriterEditableSmartContent"&gt;&lt;p&gt; &lt;a href="http://blogs.microsoft.co.il/blogs/pavely/VectorPainter_7A5E98E1.zip" target="_blank"&gt;Paining Program demo&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1057413" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/MVVM/default.aspx">MVVM</category></item><item><title>What’s New in CLR 4.5 Debugging API?</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/04/03/what-s-new-in-clr-4-5-debugging-api.aspx</link><pubDate>Tue, 03 Apr 2012 16:51:39 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1053436</guid><dc:creator>pavely</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1053436</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1053436</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/04/03/what-s-new-in-clr-4-5-debugging-api.aspx#comments</comments><description>&lt;p&gt;The most used command in the SOS extension DLL is probably &lt;strong&gt;!dumpheap&lt;/strong&gt;. This command is able to show every object on the managed heap. This capability has no match within Visual Studio. The reason is that Visual Studio uses the &lt;a href="http://msdn.microsoft.com/en-us/library/ms404520.aspx" target="_blank"&gt;CLR debugging API&lt;/a&gt;, that doesn’t seem to have this capability.&lt;/p&gt; &lt;p&gt;At first glance, the &lt;a href="http://msdn.microsoft.com/en-us/library/ms232460.aspx" target="_blank"&gt;ICorDebugProcess&lt;/a&gt; interface has the perfect method: &lt;a href="http://msdn.microsoft.com/en-us/library/ms231010.aspx" target="_blank"&gt;EnumerateObjects&lt;/a&gt;. What could be better than that? Unfortunately, the documentation states that this method is not implemented… bummer.&lt;/p&gt; &lt;p&gt;A while back I created a project &lt;a href="http://blogs.microsoft.co.il/blogs/pavely/archive/2008/08/10/clr-explorer-tool.aspx" target="_blank"&gt;CLR Explorer&lt;/a&gt;. This was supposed to be a tool to look at managed processes. Looking at metadata was easy enough, but runtime information was scarce, as the debug interfaces did not have a way to get managed heap information.&lt;/p&gt; &lt;p&gt;With .NET 4.5. beta released, I looked through the debug interfaces. I wanted to see if anything changed since CLR 4. I discovered there is a new interface supposedly supported on a &lt;strong&gt;CorDebugProcess&lt;/strong&gt; object, &lt;a href="http://msdn.microsoft.com/en-us/library/hh361076(v=VS.110).aspx" target="_blank"&gt;ICorDebugProcess5.&lt;/a&gt; This new interface (the previous one was ICorDebugProcess3 – clearly the number 4 was to be avoided to not give the false impression that this is available with CLR 4).&lt;/p&gt; &lt;p&gt;This new interface has a method named &lt;a href="http://msdn.microsoft.com/en-us/library/hh361104(v=vs.110).aspx" target="_blank"&gt;EnumerateHeap&lt;/a&gt; – great! finally… and the method seems to be documented as having an actual implementation.&lt;/p&gt; &lt;p&gt;So, I decided to give it a try…&lt;/p&gt; &lt;h2&gt;Attaching to a Process&lt;/h2&gt; &lt;p&gt;Warning! C++ (and COM) ahead!&lt;/p&gt; &lt;p&gt;First, let’s get the CLR meta host object:&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:c96057bd-c8da-4a47-a9d2-3c290503111f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICLRMetaHost&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; spMetaHost;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;hr = ::CLRCreateInstance(CLSID_CLRMetaHost, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;__uuidof&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICLRMetaHost&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;), (&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;**)&amp;amp;spMetaHost);&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;This object is the root for starting to work with the CLR (debugging or not). It was introduced in CLR 4.&lt;/p&gt; &lt;p&gt;We need to get the &lt;a href="http://msdn.microsoft.com/en-us/library/ms230588.aspx" target="_blank"&gt;ICorDebug&lt;/a&gt; interface. This is how it’s done (&lt;strong&gt;hProcess&lt;/strong&gt; is a handle to the process we want to attach to – obtained using the usual &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320(v=vs.85).aspx" target="_blank"&gt;OpenProcess&lt;/a&gt; API):&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:9bc00242-cffd-4e09-a8a8-48ab9f7c2ad8" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;IEnumUnknown&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; spEnumUnk;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;spMetaHost-&amp;gt;EnumerateLoadedRuntimes(hProcess, &amp;amp;spEnumUnk);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;IUnknown&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; unk;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;spEnumUnk-&amp;gt;Next(1, &amp;amp;unk, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#6f008a;"&gt;NULL&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComQIPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICLRRuntimeInfo&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; spInfo(unk);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#6f008a;"&gt;ATLASSERT&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(spInfo);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICorDebug&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; spDebug;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;spInfo-&amp;gt;GetInterface(CLSID_CLRDebuggingLegacy, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;__uuidof&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICorDebug&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;), (&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;void&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;**)&amp;amp;spDebug);&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;(Error handling is mostly non existing to keep the code short)&lt;/p&gt; &lt;p&gt;Now we need to initialize the &lt;strong&gt;ICorDebug&lt;/strong&gt; object and attach to the process to debug:&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:797f7333-7ccc-4b5a-8d02-c7ac4b7245a6" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;hr = spDebug-&amp;gt;Initialize();&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComObject&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CDebugManagedCallback&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt;* pHandler;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;pHandler-&amp;gt;CreateInstance(&amp;amp;pHandler);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;spDebug-&amp;gt;SetManagedHandler(pHandler);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICorDebugProcess&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; spProcess;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;hr = spDebug-&amp;gt;DebugActiveProcess(pid, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#6f008a;"&gt;FALSE&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;, &amp;amp;spProcess);&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The &lt;strong&gt;CDebugManagedCallback&lt;/strong&gt; class is a local C++ COM class that is the handler for debugging events. I will not show this one here (you can check out the CLR Explorer project to see one such class in action). For the purpose of this post, it really is just there so &lt;strong&gt;ICorDebug &lt;/strong&gt;would be happy.&lt;/p&gt; &lt;p&gt;Now for the fun part. Can we get an &lt;strong&gt;ICorDebugProcess5&lt;/strong&gt;? If we can, let’s use it:&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:8ee1a89b-9902-474a-8b76-fce74b824058" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComQIPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICorDebugProcess5&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; spProcess5(spProcess);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(spProcess5) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;COR_HEAPINFO&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; heapInfo;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;hr = spProcess-&amp;gt;Stop(0);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;hr = spProcess5-&amp;gt;GetGCHeapInformation(&amp;amp;heapInfo);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#800000;"&gt;&amp;quot;GC Type: &amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &amp;lt;&amp;lt; (heapInfo.gcType == &lt;/span&gt;&lt;span style="background:#fffbf0;color:#2f4f4f;"&gt;CorDebugWorkstationGC&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; ? &lt;/span&gt;&lt;span style="background:#fffbf0;color:#800000;"&gt;&amp;quot;Workstation&amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; : &lt;/span&gt;&lt;span style="background:#fffbf0;color:#800000;"&gt;&amp;quot;Server&amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;) &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#800000;"&gt;&amp;quot;Heaps: &amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &amp;lt;&amp;lt; heapInfo.numHeaps &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(heapInfo.areGCStructuresValid) {&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICorDebugHeapEnum&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; spEnumHeap;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;hr = spProcess5-&amp;gt;EnumerateHeap(&amp;amp;spEnumHeap);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ULONG&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; count;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;hr = spEnumHeap-&amp;gt;GetCount(&amp;amp;count);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(&lt;/span&gt;&lt;span style="background:#fffbf0;color:#6f008a;"&gt;SUCCEEDED&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(hr)) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#008000;"&gt;// unfortunately... hr = E_NOTIMPL&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;cout &amp;lt;&amp;lt; &lt;/span&gt;&lt;span style="background:#fffbf0;color:#800000;"&gt;&amp;quot;# Objects: &amp;quot;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; &amp;lt;&amp;lt; count &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;COR_HEAPOBJECT&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; obj;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;hr = spEnumHeap-&amp;gt;Next(1, &amp;amp;obj, &lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;nullptr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;);    &lt;/span&gt;&lt;span style="background:#fffbf0;color:#008000;"&gt;// works!&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CComPtr&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;ICorDebugType&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;&amp;gt; spType;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;spProcess5-&amp;gt;GetTypeForTypeID(obj.type, &amp;amp;spType);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#0000ff;"&gt;if&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;(spType) {&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;&lt;/span&gt;&lt;span style="background:#fffbf0;color:#2b91af;"&gt;CorElementType&lt;/span&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt; type;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;spType-&amp;gt;GetType(&amp;amp;type);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="background:#fffbf0;color:#000000;"&gt;cout &amp;lt;&amp;lt; type &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#fffbf0;color:#000000;"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/hh361106(v=vs.110).aspx" target="_blank"&gt;ICorDebugProcess5::GetGCHeapInformation&lt;/a&gt; gets some basic info for the heap. Then we can enumerate the objects on the managed heap. The &lt;strong&gt;GetCount&lt;/strong&gt; method on the enumeration interface is not implemented, which makes perfect sense, since this information is unknown to the CLR, would be expensive to keep track of, and adds no real value.&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;Next &lt;/strong&gt;method however, works! Now we can enumerate the heap!&lt;/p&gt; &lt;p&gt;A new version of &lt;strong&gt;CLR Explorer &lt;/strong&gt;is certainly due!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1053436" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/COM/default.aspx">COM</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/CLR/default.aspx">CLR</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/CLR+Explorer/default.aspx">CLR Explorer</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Win32/default.aspx">Win32</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Visual+Studio+11/default.aspx">Visual Studio 11</category></item><item><title>My Async Programming with C# 5.0 &amp; .NET 4.5 session is available for viewing</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/28/my-async-programming-with-c-5-0-amp-net-4-5-session-is-available-for-viewing.aspx</link><pubDate>Wed, 28 Mar 2012 20:26:33 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1047030</guid><dc:creator>pavely</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1047030</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1047030</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/28/my-async-programming-with-c-5-0-amp-net-4-5-session-is-available-for-viewing.aspx#comments</comments><description>&lt;p&gt;The session &lt;a href="http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/26/asynchronous-programming-with-c-5-0-amp-net-4-5-session.aspx" target="_blank"&gt;I gave at Microsoft Ra’anana&lt;/a&gt; two days is available on &lt;a href="http://channel9.msdn.com/" target="_blank"&gt;channel 9&lt;/a&gt;. This was in Hebrew, so if this is not your native tongue, you can probably still enjoy the code demos. Here are the links:&lt;/p&gt; &lt;p&gt;&lt;a href="http://channel9.msdn.com/Blogs/bursteg/Async-Programming-using-C-50-and-Tasks-in-NET-45-and-WinRT-Part-1" target="_blank"&gt;Part 1&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://channel9.msdn.com/Blogs/bursteg/Async-Programming-using-C-50-and-Tasks-in-NET-45-and-WinRT-Part-2" target="_blank"&gt;Part 2&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1047030" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/video/default.aspx">video</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_+5.0/default.aspx">C# 5.0</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Visual+Studio+11/default.aspx">Visual Studio 11</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+Runtime/default.aspx">Windows Runtime</category></item><item><title>Asynchronous Programming with C# 5.0 &amp; .NET 4.5 Session</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/26/asynchronous-programming-with-c-5-0-amp-net-4-5-session.aspx</link><pubDate>Mon, 26 Mar 2012 11:38:52 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1043880</guid><dc:creator>pavely</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1043880</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1043880</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/26/asynchronous-programming-with-c-5-0-amp-net-4-5-session.aspx#comments</comments><description>&lt;p&gt;This morning I gave a session on &lt;strong&gt;&lt;a href="http://isrmsdn-c-sharp5-mar2012.eventbrite.com/" target="_blank"&gt;asynchronous programming with C# 5.0&lt;/a&gt;&lt;/strong&gt; at Microsoft offices in Ra’anana. Thank you all for attending, it was great fun!&lt;/p&gt; &lt;p&gt;As promised, the presentation slides and demos are attached below (the Windows 8 demos can naturally be run on Windows 8 only).&lt;/p&gt; &lt;p&gt;The session was recorded, so if you missed it, or just want to hear the same jokes again, the recording will be available in a few days – check out the &lt;a href="http://blogs.microsoft.co.il/blogs/msdn/" target="_blank"&gt;MSDN blog&lt;/a&gt; for details of availability.&lt;/p&gt; &lt;p&gt;&lt;a href="http://dl.dropbox.com/u/55059141/OpenHouses/AsyncProgC%235.0.NET4.5/Dev11Demos.zip" target="_blank"&gt;Async Demos&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://dl.dropbox.com/u/55059141/OpenHouses/AsyncProgC%235.0.NET4.5/ImageViewer.zip" target="_blank"&gt;Async Metro Demo&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://dl.dropbox.com/u/55059141/OpenHouses/AsyncProgC%235.0.NET4.5/AsyncProgramming.pdf" target="_blank"&gt;Presentation Slides&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1043880" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/OpenDay/default.aspx">OpenDay</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4/default.aspx">.NET 4</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_+5.0/default.aspx">C# 5.0</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+Runtime/default.aspx">Windows Runtime</category></item><item><title>INotifyPropertyChanged implementation with C# 5.0</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/20/inotifypropertychanged-implementation-with-c-5-0.aspx</link><pubDate>Tue, 20 Mar 2012 20:40:30 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1038721</guid><dc:creator>pavely</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1038721</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1038721</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/20/inotifypropertychanged-implementation-with-c-5-0.aspx#comments</comments><description>The INotifyPropertyChanged interface has become a very popular interface, typically used in MVVM scenarios (WPF/Silverlight). It looks simple, with a single member, which is an event, and its basic implementation by some data type may be something like this: class Book : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged( string propName) { var pc = PropertyChanged; if (pc != null ) pc( this , new PropertyChangedEventArgs (propName...(&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/20/inotifypropertychanged-implementation-with-c-5-0.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1038721" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_+5.0/default.aspx">C# 5.0</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category></item><item><title>What happened to asynchrony with WebClient in .NET 4.5?</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/17/what-happened-to-asynchrony-with-webclient-in-net-4-5.aspx</link><pubDate>Sat, 17 Mar 2012 14:01:13 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1036224</guid><dc:creator>pavely</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1036224</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1036224</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/17/what-happened-to-asynchrony-with-webclient-in-net-4-5.aspx#comments</comments><description>In the Visual Studio 2010 Async CTP , a bunch of extension methods have been added to the WebClient class, to facilitate the “awaiting” of C# 5.0, such as DownloadStringTaskAsync , which can be simply used like so: var wc = new WebClient (); string result = await wc.DownloadStringTaskAsync( &amp;quot;http://msdn.microsoft.com&amp;quot; ); One of the overloads present in the CTP accepts a CancellationToken , so that the operation could be cancelled by an external CancellationTokenSource . For example: async...(&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/17/what-happened-to-asynchrony-with-webclient-in-net-4-5.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1036224" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4/default.aspx">.NET 4</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_+5.0/default.aspx">C# 5.0</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category></item><item><title>Presentations I’ll be giving this month</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/13/presentation-i-ll-be-giving-this-month.aspx</link><pubDate>Tue, 13 Mar 2012 21:03:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1032845</guid><dc:creator>pavely</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1032845</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1032845</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/13/presentation-i-ll-be-giving-this-month.aspx#comments</comments><description>This month turned out to be a busy one for me, at least as far as public presentations are concerned. All sessions are free of charge, but you should register – details follow: Parallel and Asynchronous Programming with .NET 4/4.5 and C# 5.0 This session is to be held on the 20th, at John Bryce offices in Tel Aviv. I will do a quick recap of tasks and the Parallel class, and then move to async programming with and without the new C# 5.0 features. I will be using VS 2010 and the recently released...(&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/13/presentation-i-ll-be-giving-this-month.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1032845" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Threading/default.aspx">Threading</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_+5.0/default.aspx">C# 5.0</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET+4.5/default.aspx">.NET 4.5</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Visual+Studio+11/default.aspx">Visual Studio 11</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Windows+Runtime/default.aspx">Windows Runtime</category></item><item><title>Static vs. Instance (vs. Extension)</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/09/static-vs-instance-vs-extension.aspx</link><pubDate>Thu, 08 Mar 2012 23:01:11 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1029959</guid><dc:creator>pavely</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1029959</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1029959</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/09/static-vs-instance-vs-extension.aspx#comments</comments><description>Sometimes I teach a basic .NET &amp;amp; C# course. Among many other things, I discuss arrays. I mention that all .NET arrays derive from System.Array , and so get some functionality for free, such as sorting. Here’s a simple array: int [] a = new int [10]; Now, the inexperienced student may type “a.”, opening the intellisense list box, and look for a method named Sort – after all, the instructor (me) said arrays support such an operation. The confused student can’t find any such method. Of course the...(&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/09/static-vs-instance-vs-extension.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1029959" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/thoughts/default.aspx">thoughts</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/MEF/default.aspx">MEF</category></item><item><title>Visual Studio 11 Beta–First Impressions</title><link>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/02/visual-studio-11-beta-first-impressions.aspx</link><pubDate>Fri, 02 Mar 2012 08:37:49 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1024317</guid><dc:creator>pavely</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.microsoft.co.il/blogs/pavely/rsscomments.aspx?PostID=1024317</wfw:commentRss><wfw:comment>http://blogs.microsoft.co.il/blogs/pavely/commentapi.aspx?PostID=1024317</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/02/visual-studio-11-beta-first-impressions.aspx#comments</comments><description>Visual Studio 11 Beta is out (along with Windows 8 Beta), so naturally, I installed it right away (I did create a restore point just in case…). I wanted to get some first impressions of VS 11, and this is the result. Installation Installing VS 11 was easier than ever, because there were no choices at all – just install and be done with it. No way to remove unneeded components. I don’t know if this is going to be the final install experience, but this is certainly new. I’m still not sure this is entirely...(&lt;a href="http://blogs.microsoft.co.il/blogs/pavely/archive/2012/03/02/visual-studio-11-beta-first-impressions.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1024317" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/thoughts/default.aspx">thoughts</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/pavely/archive/tags/Visual+Studio+11/default.aspx">Visual Studio 11</category></item></channel></rss>

