<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
  <channel>
    <title>Mike Taulty's Weblog</title>
    <description>Bits and Bytes</description>
    <link>http://mtaulty.com/CommunityServer/roller/default.aspx</link>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Community Server v2.0 (http://www.communityserver.org)</generator>
    <item>
      <title>Outlook 2007: &amp;quot;The Text Formatting Command is not Available&amp;quot;</title>
      <description>&lt;p&gt;Hmm.&lt;/p&gt; &lt;p&gt;I was reading my mail this morning. Shutdown Outlook to do something else ( I do this, I don't like leaving Outlook running otherwise it eats your day ).&lt;/p&gt; &lt;p&gt;I run it up later on and notice that the reading pane isn't displaying the selected mail. I double click on a mail and Outlook tells me;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Unable to display mail. The Text Formatting Command is not Available"&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Weird! All I've done since I last ran Outlook is to do some stuff in Visual Studio. I didn't think that would have broken Outlook :-(&lt;/p&gt; &lt;p&gt;I do a bit of a search and the only KB article I can find is;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a title="http://support.microsoft.com/kb/235244/en-us" href="http://support.microsoft.com/kb/235244/en-us"&gt;http://support.microsoft.com/kb/235244/en-us&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;which tells me to uninstall/reinstall IE but that seems a bit scary in that I have IE8 whereas this article was written around IE4 which feels like a very long time ago.&lt;/p&gt; &lt;p&gt;I opt to do a "Repair" on "Office Enterprise 2007" and see if that resolves anything for me. &lt;/p&gt; &lt;p&gt;And...it does. Or maybe it does. It asks me to reboot and I don't feel confident enough to ignore it so I let it reboot the box and when it comes back up I can read mail once again in Outlook. So, either the reboot fixed it or the repair fixed it but either way it's back and alive.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10820" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/06/10820.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10820.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10820</guid>
      <pubDate>Mon, 06 Oct 2008 03:18:24 GMT</pubDate>
    </item>
    <item>
      <title>WPF Pixel Shader Library on CodePlex</title>
      <description>&lt;p&gt;Via Jaime R, there's a whole set of transitions and effects to download up at CodePlex if you're on 3.5 Sp1.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/jaimer/archive/2008/10/03/announcement-wpf-shader-effects-library-on-codeplex.aspx"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10819" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/06/10819.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10819.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10819</guid>
      <pubDate>Mon, 06 Oct 2008 01:08:25 GMT</pubDate>
    </item>
    <item>
      <title>WPF and Virtual Eath, Part 2</title>
      <description>&lt;p&gt;Following on from &lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/03/10813.aspx"&gt;here&lt;/a&gt;, I thought I'd add a little bit of pushpin support to my basic Virtual Earth control for WPF.&lt;/p&gt; &lt;p&gt;Essentially, I added a new property to the control called &lt;strong&gt;PushPins&lt;/strong&gt; and each one of those is just a tuple of;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;{ Latitude, Longitude, Text }&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;to be placed on the map.&lt;/p&gt; &lt;p&gt;This means that from XAML I can create a set of pushpins in a declarative way as in;&lt;/p&gt;&lt;pre class="csharpcode"&gt;      &amp;lt;ve:VirtualEarth
        x:Name=&lt;span class="str"&gt;"veControl"&lt;/span&gt;
        Grid.Column=&lt;span class="str"&gt;"1"&lt;/span&gt;
        ZoomLevel=&lt;span class="str"&gt;"{Binding Path=Value, ElementName=slidey}"&lt;/span&gt;
        Latitude=&lt;span class="str"&gt;"{Binding Path=Text, ElementName=txtLat}"&lt;/span&gt;
        Longitude=&lt;span class="str"&gt;"{Binding Path=Text, ElementName=txtLon}"&lt;/span&gt;
        MapStyle=&lt;span class="str"&gt;"{Binding Path=Text, ElementName=cmbMapStyle}"&lt;/span&gt;&amp;gt;
        &amp;lt;ve:VirtualEarth.PushPins&amp;gt;
          &amp;lt;ve:PushPin
            Latitude=&lt;span class="str"&gt;"47.6"&lt;/span&gt;
            Longitude=&lt;span class="str"&gt;"-122.33"&lt;/span&gt;
            Text=&lt;span class="str"&gt;"Seattle 1"&lt;/span&gt; /&amp;gt;
          &amp;lt;ve:PushPin
            Latitude=&lt;span class="str"&gt;"47.7"&lt;/span&gt;
            Longitude=&lt;span class="str"&gt;"-122.33"&lt;/span&gt;
            Text=&lt;span class="str"&gt;"Seattle 2"&lt;/span&gt; /&amp;gt;
          &amp;lt;ve:PushPin
            Latitude=&lt;span class="str"&gt;"47.8"&lt;/span&gt;
            Longitude=&lt;span class="str"&gt;"-122.33"&lt;/span&gt;
            Text=&lt;span class="str"&gt;"Seattle 3"&lt;/span&gt; /&amp;gt;
        &amp;lt;/ve:VirtualEarth.PushPins&amp;gt;

      &amp;lt;/ve:VirtualEarth&amp;gt;
&lt;/pre&gt;
&lt;p&gt;or I could databind them but either way in code if I want to manipulate that collection I can just do something like;&lt;/p&gt;&lt;pre class="csharpcode"&gt;veControl.PushPins.Remove(p);&lt;/pre&gt;
&lt;p&gt;or;&lt;/p&gt;&lt;pre class="csharpcode"&gt;   PushPin p = &lt;span class="kwrd"&gt;new&lt;/span&gt; PushPin()
        {
          Latitude = &lt;span class="kwrd"&gt;double&lt;/span&gt;.Parse(txtAddLat.Text),
          Longitude = &lt;span class="kwrd"&gt;double&lt;/span&gt;.Parse(txtAddLon.Text),
          Text = txtAddName.Text
        };
        veControl.PushPins.Add(p);&lt;/pre&gt;
&lt;p&gt;and that seems to work reasonably well. I also added a lookup routine which will asynchronously go and look up a postcode and bring it back as a Lat/Lon which means I can now write code such as;&lt;/p&gt;&lt;pre class="csharpcode"&gt;veControl.BeginLookupPostCode(txtPostcode.Text, Callback, txtPostcode.Text);&lt;/pre&gt;
&lt;p&gt;and I'll get a callback;&lt;/p&gt;&lt;pre class="csharpcode"&gt;   &lt;span class="kwrd"&gt;void&lt;/span&gt; Callback(IAsyncResult result)
    {
      &lt;span class="kwrd"&gt;try&lt;/span&gt;
      {
        PostCodeLookupResult postCode = veControl.EndLookupPostCode(result);

        txtAddLat.Text = postCode.Latitude.ToString();
        txtAddLon.Text = postCode.Longitude.ToString();
      }
      &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception e)
      {
        MessageBox.Show(e.Message);
      }
    }&lt;/pre&gt;
&lt;p&gt;which contains the Lat/Lon of the post-code that I looked up. What I &lt;em&gt;haven't&lt;/em&gt; done is to implement INotifyPropertyChanged on a PushPin and then move the pin on the map if you change a property - I'd currently have to remove and re-add any pushpin that changed.&lt;/p&gt;
&lt;p&gt;I added some support for PushPins into my little test harness which now looks like;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/WPFandVirtualEathPart2_ED7F/image.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/WPFandVirtualEathPart2_ED7F/image_thumb.png" width="244" height="184"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;and allows me to basically manipulate the new functionality.&lt;/p&gt;
&lt;p&gt;Once again, I've put the code &lt;a href="http://mtaulty.com/downloads/WpfVEControl.zip"&gt;up here for download&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10816" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/05/10816.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10816.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10816</guid>
      <pubDate>Sun, 05 Oct 2008 08:53:59 GMT</pubDate>
    </item>
    <item>
      <title>WPF and Virtual Earth</title>
      <description>&lt;p&gt;WPF Version 3.5 Service Pack 1 has a new &lt;strong&gt;WebBrowser&lt;/strong&gt; control as I talked about a little here;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a title="http://channel9.msdn.com/posts/mtaulty/WPF-35-Sp1-WebBrowser-Control/" href="http://channel9.msdn.com/posts/mtaulty/WPF-35-Sp1-WebBrowser-Control/"&gt;http://channel9.msdn.com/posts/mtaulty/WPF-35-Sp1-WebBrowser-Control/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;and some of the nice things about the control are;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;It can load HTML from a &lt;strong&gt;Stream&lt;/strong&gt; or a &lt;strong&gt;string &lt;/strong&gt;- i.e. you don't have to hit the web.&lt;/li&gt; &lt;li&gt;You can call from the surrounding .NET code into script inside the control.&lt;/li&gt; &lt;li&gt;You can call from script inside the control into the surrounding .NET code.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;This seemed to be enough to form the basis of using the Virtual Earth control inside of WPF so I set about trying to build a control that did a very basic version of that.&lt;/p&gt; &lt;p&gt;The basic approach that I took is;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;WPF UserControl with dependency properties for &lt;strong&gt;Latitude, Longitude, ZoomLevel&lt;/strong&gt; and &lt;strong&gt;MapStyle.&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Put an embedded HTML file inside the resources of my control's assembly which contains the HTML needed to load the Virtual Earth control along with the script needed to;&lt;/li&gt; &lt;ol&gt; &lt;li&gt;Make it possible to set the &lt;strong&gt;Latitude, Longitude, ZoomLevel&lt;/strong&gt; and &lt;strong&gt;MapStyle&lt;/strong&gt; from my UserControl.&lt;/li&gt; &lt;li&gt;Pass appropriate notifications back from the Virtual Earth control to my control.&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt; &lt;p&gt;That's pretty much it - I've not finished it yet by any means as I want to add some push-pin functionality and I'm sure there's bugs in this thing.&lt;/p&gt; &lt;p&gt;Along the way I did get a little bit foxed at one point because I want to be able to use my control in scenarios such as&lt;/p&gt;&lt;pre class="csharpcode"&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ve:VirtualEarth&lt;/span&gt;
        &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="veControl"&lt;/span&gt;
        &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Column&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt;
        &lt;span class="attr"&gt;ZoomLevel&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=Value, ElementName=slidey}"&lt;/span&gt;
        &lt;span class="attr"&gt;Latitude&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=Text, ElementName=txtLat}"&lt;/span&gt;
        &lt;span class="attr"&gt;Longitude&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=Text, ElementName=txtLon}"&lt;/span&gt;
        &lt;span class="attr"&gt;MapStyle&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Path=Text, ElementName=cmbMapStyle}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;So, everything there is databound. Seems easy but the "problem" I got into was that WPF's databinding would start setting these properties and I would pass them through to the Virtual Earth control &lt;strong&gt;&lt;em&gt;before &lt;/em&gt;&lt;/strong&gt;it was ready to accept them and it would fail a lot.&lt;/p&gt;
&lt;p&gt;So, I had to put a bit of a queue in between the WPF control and the Virtual Earth control where I queue up commands for the control if the control has not yet said that it is "ready".&lt;/p&gt;
&lt;p&gt;Here's an example of the control in use in a simple test-harness;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/WPFandVirtualEarth_D193/image.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/WPFandVirtualEarth_D193/image_thumb.png" width="644" height="484"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;And it's entirely declaratively data bound there.&lt;/p&gt;
&lt;p&gt;I'm sure that it can relatively easily be "broken" if you play with it too much but I thought I'd share it.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/downloads/WpfVEControl.zip"&gt;Here's the solution for download&lt;/a&gt; - including the control and the test harness. I'll move this forward a little bit because I want to add the ability to search by post-code and add a few push-pins but I thought it was worth sharing.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10813" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/03/10813.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10813.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10813</guid>
      <pubDate>Fri, 03 Oct 2008 06:54:51 GMT</pubDate>
    </item>
    <item>
      <title>VS2008 Sp1 Event Resources</title>
      <description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/ericnel"&gt;Eric&lt;/a&gt; and I have published the full set of resources links from yesterday's event on What's New in Visual Studio 2008 Sp1.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.msdn.com/ukdevevents/archive/2008/10/02/2008-10-02-whats-new-in-visual-studio-2008-sp1.aspx" href="http://blogs.msdn.com/ukdevevents/archive/2008/10/02/2008-10-02-whats-new-in-visual-studio-2008-sp1.aspx"&gt;http://blogs.msdn.com/ukdevevents/archive/2008/10/02/2008-10-02-whats-new-in-visual-studio-2008-sp1.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3cbfbd80-6f5d-4997-999c-019d968c73bf" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/vs2008" rel="tag"&gt;vs2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/visual%20studio" rel="tag"&gt;visual studio&lt;/a&gt;,&lt;a href="http://technorati.com/tags/wpf" rel="tag"&gt;wpf&lt;/a&gt;,&lt;a href="http://technorati.com/tags/asp.net" rel="tag"&gt;asp.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ado.net" rel="tag"&gt;ado.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/entity%20framework" rel="tag"&gt;entity framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ado.net%20data%20services" rel="tag"&gt;ado.net data services&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8975348" width="1" height="1"&gt;</description>
      <link>http://blogs.msdn.com/mikeormond/archive/2008/10/03/vs2008-sp1-event-resources.aspx</link>
      <source url="http://blogs.msdn.com/mikeormond/default.aspx">Mike Ormond's Blog</source>
      <comments>http://blogs.msdn.com/mikeormond/comments/8975348.aspx</comments>
      <guid isPermaLink="False">91d46819-8472-40ad-a661-2c78acb4018c:8975348</guid>
      <pubDate>Fri, 03 Oct 2008 03:17:52 GMT</pubDate>
    </item>
    <item>
      <title>REMIX UK Sessions on the Web</title>
      <description>&lt;p&gt;My ( and everyone else's :-) ) sessions from REMIX UK are now live on the web for viewing up at;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a title="http://www.microsoft.com/uk/remix08/agenda.aspx" href="http://www.microsoft.com/uk/remix08/agenda.aspx"&gt;http://www.microsoft.com/uk/remix08/agenda.aspx&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I'm on Day 2 with my;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;No Silverlight ( 2 ) Application Is An Island of Richness&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Beyond Silverlight with Windows Presentation Foundation&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;sessions. &lt;/p&gt; &lt;p&gt;If I say so myself the WPF session feels a bit better than the Silverlight session as I was feeling less stuffed up with a cold at that point having "enthused" myself during the earlier session :-)&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10811" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/03/10811.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10811.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10811</guid>
      <pubDate>Fri, 03 Oct 2008 03:31:48 GMT</pubDate>
    </item>
    <item>
      <title>UK Centre on Channel 9</title>
      <description>&lt;p&gt;We've started some tentative steps towards a UK area on Channel 9 which is up here;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a title="http://channel9.msdn.com/UnitedKingdom/" href="http://channel9.msdn.com/UnitedKingdom/"&gt;http://channel9.msdn.com/UnitedKingdom/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Let me know if you've got great ideas around what should appear up there. If you're a community leader in the UK then you should see your events being advertised up there at the moment in the "resources" section.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10812" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/03/10812.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10812.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10812</guid>
      <pubDate>Fri, 03 Oct 2008 03:35:30 GMT</pubDate>
    </item>
    <item>
      <title>Things that are sent to try us</title>
      <description>&lt;p&gt;I spent many frustrating hours yesterday trying to get 2 demos to work for today's Visual Studio 2008 Sp1 event at TVP. What was very odd was that both demos (or similar) worked fine on MikeT's machine but neither worked on mine and in both cases the solution was very simple but not so obvious...&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;h4&gt;Issue 1. WPF D3DImage demo from &lt;a href="http://channel9.msdn.com/posts/AdamKinney/WPF-35-SP1-Graphics-with-David-Teitlebaum"&gt;David Teitlebaum (thanks, David)&lt;/a&gt; &lt;/h4&gt;      &lt;ul&gt;       &lt;li&gt;Run it up and just get a set of axes with some &amp;quot;moving&amp;quot; shapes. Same executable works perfectly on MikeT's machines. A bit of debugging showed a System.DllNotFoundException on my machines which Mike wasn't seeing. Eventually (after checking all the DLLs that should be there were there) this triggered a thought. I'm running 64-bit. Mike runs 32-bit. MMm, what if the managed WPF application is trying to load an unmanaged 32-bit DLL? Corflags /32BIT+ set the 32-bit flag in the header and got me up and running. Phew. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;h4&gt;Issue 2. Virtual PC cannot connect to host &lt;/h4&gt;      &lt;ul&gt;       &lt;li&gt;This was a killer. I've done this before. Many times. Why was it not working today of all days? Compared all my network settings, firewall rules etc with Mike. No differences yet his worked, mine didn't. After trying everything I could think of, checking log files (I'd never seen the Windows Firewall with Advanced Security app before - below) and essentially resorting to every desperate measure I could think of, I stopped the &amp;quot;Base Filtering Engine&amp;quot; (BFE) service temporarily (not recommended) and suddenly it worked. Hmm - the mention of IPsec in the description of BFE got me to thinking about corporate policies imposed on our boxes and the range of allowed IP addresses. I'd been using an address of 192.168.10.1 for the Loopback adapter on the host (binding to an adapter with an IP of 192.168.10.2 on the VPC). Changing this to 192.168.1.1 / 192.168.1.2 got me connectivity. Nothing to that point had even given me a clue what was blocking the traffic... &lt;/li&gt;        &lt;li&gt;[Update - I should clarify that I could ping the host with the IP address 192.168.10.1 but couldn't get any http traffic]&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mikeormond/WindowsLiveWriter/Thingsthataresenttotryus_EB37/image_2.png" rel="lightbox"&gt;&lt;img border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mikeormond/WindowsLiveWriter/Thingsthataresenttotryus_EB37/image_thumb.png" width="240" height="185" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Well that was just me getting that off my chest. What a lot of wasted effort for very little return.&lt;/p&gt;  &lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:99cfa6b3-d992-4dd0-8013-76367c76ec7b" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/argh" rel="tag"&gt;argh&lt;/a&gt;,&lt;a href="http://technorati.com/tags/frustration" rel="tag"&gt;frustration&lt;/a&gt;,&lt;a href="http://technorati.com/tags/hairloss" rel="tag"&gt;hairloss&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ipsec" rel="tag"&gt;ipsec&lt;/a&gt;,&lt;a href="http://technorati.com/tags/wpf" rel="tag"&gt;wpf&lt;/a&gt;,&lt;a href="http://technorati.com/tags/64-bit" rel="tag"&gt;64-bit&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8973794" width="1" height="1"&gt;</description>
      <link>http://blogs.msdn.com/mikeormond/archive/2008/10/02/things-that-are-sent-to-try-us.aspx</link>
      <source url="http://blogs.msdn.com/mikeormond/default.aspx">Mike Ormond's Blog</source>
      <comments>http://blogs.msdn.com/mikeormond/comments/8973794.aspx</comments>
      <guid isPermaLink="False">91d46819-8472-40ad-a661-2c78acb4018c:8973794</guid>
      <pubDate>Thu, 02 Oct 2008 08:44:41 GMT</pubDate>
    </item>
    <item>
      <title>JavaScript makes me want to cry</title>
      <description>&lt;p&gt;I spent about 3 hours today trying to figure out why some little piece of script (in amongst some other masses of script) wasn't running. I think it ultimately came down to the difference between;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;script .....&amp;gt;&lt;/p&gt; &lt;p&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;and &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;script.... /&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I know I'm a long way from being any good at Javascript so someone with experience would find these kinds of problems straight away but &lt;strong&gt;&lt;em&gt;please tell me that this is not meant to be the future of software development where we effectively do #includes of some massive lump of code at runtime.&lt;/em&gt; &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;lt;/rantOver&amp;gt;&lt;/p&gt; &lt;p&gt;As an aside, I think I've done this &lt;strong&gt;before :-)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;As a second aside, it was ultimately the developer tools in IE8 that sorted it out for me so thanks to those :-)&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10809" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/02/10809.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10809.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10809</guid>
      <pubDate>Thu, 02 Oct 2008 05:37:15 GMT</pubDate>
    </item>
    <item>
      <title>WPF - Experimenting with Multi-Input Pixel Shaders</title>
      <description>&lt;p&gt;Whilst my day job continues on its ever-accelerating decline :-) I thought I'd entertain myself by experimenting with multi-input pixel shaders in WPF following on from &lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/24/10782.aspx"&gt;the post I wrote over here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Now, luckily for me &lt;a href="http://blogs.msdn.com/greg_schechter/archive/2008/09/16/introducing-multi-input-shader-effects.aspx"&gt;Greg over here&lt;/a&gt; has already talked about it and it turns out to be not much of a stretch over what I did previously - you define a 2nd input for your shader of type brush and then you can sample from either input in order to produce the resultant effect.&lt;/p&gt; &lt;p&gt;I took my previously created "Swirl" effect and added a second brush to make a sort of "BlendAndSwirl" effect;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;float factor : register(C0);&lt;br&gt;float blend : register(C1);  &lt;p&gt;sampler2D input : register(S0);&lt;br&gt;sampler2D input2 : register(S1);  &lt;p&gt;float4 main(float2 uv : TEXCOORD) : COLOR&lt;br&gt;{&lt;br&gt;&amp;nbsp; float angle = -3.14;&lt;br&gt;&amp;nbsp; float yDist = uv.y - 0.5;&lt;br&gt;&amp;nbsp; float xDist = uv.x - 0.5;&lt;br&gt;&amp;nbsp; float dist = sqrt(xDist * xDist + yDist * yDist);&lt;br&gt;&amp;nbsp; angle *= dist * factor;  &lt;p&gt;&amp;nbsp; float xN = cos(angle) * xDist - sin(angle) * yDist;&lt;br&gt;&amp;nbsp; float yN = sin(angle) * xDist + cos(angle) * yDist;&lt;br&gt;&amp;nbsp; uv.x = xN + 0.5;&lt;br&gt;&amp;nbsp; uv.y = yN + 0.5;&lt;br&gt;&amp;nbsp; float4 img1Colour = tex2D(input, uv);&amp;nbsp; &lt;br&gt;&amp;nbsp; float4 img2Colour = tex2D(input2, uv);&lt;br&gt;&amp;nbsp; img1Colour *= blend;&lt;br&gt;&amp;nbsp; img2Colour *= (1.0 - blend);&lt;br&gt;&amp;nbsp; img2Colour += img1Colour;&lt;br&gt;&amp;nbsp; return(img2Colour);&lt;br&gt;} &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;and then wrote the C# to go hand in hand with it;&lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BlendSwirlEffect : ShaderEffect
  {
    &lt;span class="kwrd"&gt;static&lt;/span&gt; BlendSwirlEffect()
    {
      _pixelShader.UriSource = Global.MakePackUri(&lt;span class="str"&gt;"effect1.ps"&lt;/span&gt;);
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; BlendSwirlEffect()
    {
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.PixelShader = _pixelShader;

      UpdateShaderValue(InputProperty);
      UpdateShaderValue(Input2Property);
      UpdateShaderValue(SwirlProperty);
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush Input
    {
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; (Brush)GetValue(InputProperty); }
      set { SetValue(InputProperty, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty InputProperty =
        ShaderEffect.RegisterPixelShaderSamplerProperty(&lt;span class="str"&gt;"Input"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(BlendSwirlEffect), 0);

    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush Input2
    {
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; ((Brush)GetValue(Input2Property)); }
      set { SetValue(Input2Property, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty Input2Property =
      ShaderEffect.RegisterPixelShaderSamplerProperty(&lt;span class="str"&gt;"Input2"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(BlendSwirlEffect), 1);

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; Swirl
    {
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;double&lt;/span&gt;)GetValue(SwirlProperty); }
      set { SetValue(SwirlProperty, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty SwirlProperty =
        DependencyProperty.Register(&lt;span class="str"&gt;"Swirl"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;double&lt;/span&gt;), &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(BlendSwirlEffect),
                &lt;span class="kwrd"&gt;new&lt;/span&gt; UIPropertyMetadata(0.0, PixelShaderConstantCallback(0)));

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; Blend
    {
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;double&lt;/span&gt;)GetValue(BlendProperty); }
      set { SetValue(BlendProperty, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty BlendProperty =
        DependencyProperty.Register(&lt;span class="str"&gt;"Blend"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;double&lt;/span&gt;), &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(BlendSwirlEffect),
                &lt;span class="kwrd"&gt;new&lt;/span&gt; UIPropertyMetadata(0.0, PixelShaderConstantCallback(1)));

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; PixelShader _pixelShader = &lt;span class="kwrd"&gt;new&lt;/span&gt; PixelShader();
  }
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;there's nothing too magical going on in here - we just have a 2nd brush to play with and sample and then I've got 2 factors to control the "level" of Blending of one picture with another and the "factor" applied to the Swirl.&lt;/p&gt;
&lt;p&gt;I then built a little UI to use the effect;&lt;/p&gt;&lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="mainGrid"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ImageBrush&lt;/span&gt;
        &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;="brush1"&lt;/span&gt;
        &lt;span class="attr"&gt;ImageSource&lt;/span&gt;&lt;span class="kwrd"&gt;="c:\windows\web\wallpaper\img1.jpg"&lt;/span&gt;
        &lt;span class="attr"&gt;Stretch&lt;/span&gt;&lt;span class="kwrd"&gt;="Fill"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;
        &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;="sbAnimate"&lt;/span&gt; &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetName&lt;/span&gt;&lt;span class="kwrd"&gt;="blendEffect"&lt;/span&gt; &lt;span class="attr"&gt;FillBehavior&lt;/span&gt;&lt;span class="kwrd"&gt;="HoldEnd"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DoubleAnimation&lt;/span&gt;
          &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;="Blend"&lt;/span&gt;
          &lt;span class="attr"&gt;From&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt;
          &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; 
          &lt;span class="attr"&gt;BeginTime&lt;/span&gt;&lt;span class="kwrd"&gt;="00:00:00.5"&lt;/span&gt;
          &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;="00:00:00.5"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DoubleAnimation&lt;/span&gt;
          &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;="Swirl"&lt;/span&gt;
          &lt;span class="attr"&gt;From&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt;
          &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;="4"&lt;/span&gt; 
          &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;="00:00:01"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DoubleAnimation&lt;/span&gt;
          &lt;span class="attr"&gt;Storyboard&lt;/span&gt;.&lt;span class="attr"&gt;TargetProperty&lt;/span&gt;&lt;span class="kwrd"&gt;="Swirl"&lt;/span&gt;
          &lt;span class="attr"&gt;From&lt;/span&gt;&lt;span class="kwrd"&gt;="4"&lt;/span&gt;
          &lt;span class="attr"&gt;To&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt;
          &lt;span class="attr"&gt;Duration&lt;/span&gt;&lt;span class="kwrd"&gt;="00:00:01"&lt;/span&gt;
          &lt;span class="attr"&gt;BeginTime&lt;/span&gt;&lt;span class="kwrd"&gt;="00:00:02"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Storyboard&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt;
        &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="4*"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Image&lt;/span&gt;
      &lt;span class="attr"&gt;Source&lt;/span&gt;&lt;span class="kwrd"&gt;="c:\windows\web\wallpaper\img2.jpg"&lt;/span&gt;
      &lt;span class="attr"&gt;Stretch&lt;/span&gt;&lt;span class="kwrd"&gt;="Fill"&lt;/span&gt;
      &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Image.Effect&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:BlendSwirlEffect&lt;/span&gt;
          &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="blendEffect"&lt;/span&gt;
          &lt;span class="attr"&gt;Input2&lt;/span&gt;&lt;span class="kwrd"&gt;="{DynamicResource brush1}"&lt;/span&gt;
          &lt;span class="attr"&gt;Swirl&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding ElementName=swirlSlider,Path=Value}"&lt;/span&gt;
          &lt;span class="attr"&gt;Blend&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding ElementName=blendSlider,Path=Value}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Image.Effect&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Image&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt; &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; 
      &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Stretch"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ColumnDefinition&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;
        &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Slider&lt;/span&gt;
          &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="blendSlider"&lt;/span&gt;
          &lt;span class="attr"&gt;Minimum&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt;
          &lt;span class="attr"&gt;Maximum&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt;
          &lt;span class="attr"&gt;MinWidth&lt;/span&gt;&lt;span class="kwrd"&gt;="192"&lt;/span&gt;
          &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="5"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt;
          &lt;span class="attr"&gt;FontSize&lt;/span&gt;&lt;span class="kwrd"&gt;="14"&lt;/span&gt;
          &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="Blend"&lt;/span&gt;
          &lt;span class="attr"&gt;TextAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Center"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;
        &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt;
        &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Column&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Slider&lt;/span&gt;
          &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="swirlSlider"&lt;/span&gt;
          &lt;span class="attr"&gt;Minimum&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt;
          &lt;span class="attr"&gt;Maximum&lt;/span&gt;&lt;span class="kwrd"&gt;="4"&lt;/span&gt;
          &lt;span class="attr"&gt;MinWidth&lt;/span&gt;&lt;span class="kwrd"&gt;="192"&lt;/span&gt;
          &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="5"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt;
        &lt;span class="attr"&gt;FontSize&lt;/span&gt;&lt;span class="kwrd"&gt;="14"&lt;/span&gt;
        &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="Swirl"&lt;/span&gt;
        &lt;span class="attr"&gt;TextAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Center"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;      
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt;
        &lt;span class="attr"&gt;FontSize&lt;/span&gt;&lt;span class="kwrd"&gt;="14"&lt;/span&gt;
        &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Animate"&lt;/span&gt;
        &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="OnAnimate"&lt;/span&gt; 
        &lt;span class="attr"&gt;MinHeight&lt;/span&gt;&lt;span class="kwrd"&gt;="48"&lt;/span&gt;
        &lt;span class="attr"&gt;MinWidth&lt;/span&gt;&lt;span class="kwrd"&gt;="192"&lt;/span&gt;
        &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Center"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Which just defines an Image that's using the &lt;strong&gt;BlendSwirlEffect&lt;/strong&gt; and a second image brush that it's using as the 2nd image to sample in the pixel shader ( &lt;strong&gt;Input2&lt;/strong&gt; in the code and the XAML ).&lt;/p&gt;
&lt;p&gt;This gives a UI like thi;s&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/WPFExperimentingwithMultiInputPixelShade_21F/image.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/WPFExperimentingwithMultiInputPixelShade_21F/image_thumb.png" width="244" height="184"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;where I can then go and blend/swirl a little;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/WPFExperimentingwithMultiInputPixelShade_21F/image_3.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/WPFExperimentingwithMultiInputPixelShade_21F/image_thumb_3.png" width="244" height="184"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;and I stuck a little animation on there that animates both properties at the same time. Here's the project code if you want to play with it - note that to compile it you'll need the directX SDK so I've included the binary files &lt;a href="http://mtaulty.com/downloads/WpfMultiShader.zip"&gt;in the project in case you just want to run it&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10805" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/01/10805.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10805.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10805</guid>
      <pubDate>Wed, 01 Oct 2008 17:00:47 GMT</pubDate>
    </item>
    <item>
      <title>Forcing 32-bit CLR Exes on a 64-bit Machine</title>
      <description>&lt;p&gt;This one really comes via &lt;a href="http://blogs.msdn.com/mikeormond/"&gt;Mike&lt;/a&gt; in that today we were both running the same application on our machines ( same machine spec ) and it was working for me but not for him.&lt;/p&gt; &lt;p&gt;We were foxed until he pointed out that he was running 64-bit ( which I stopped running a little while ago ).&lt;/p&gt; &lt;p&gt;This was an EXE that was using a bunch of .NET CLR assemblies plus a bunch of unmanaged assemblies which seemed to be failing to load.&lt;/p&gt; &lt;p&gt;So...as we remembered &lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2005/03/20/5358.aspx"&gt;from here&lt;/a&gt; you can't have a mixed 32-bit/64-bit process on a 64-bit machine. It has to be all one or the other.&lt;/p&gt; &lt;p&gt;Problem is, if you compile for CLR then generally you choose "any platform" which means Mike's EXE was choosing to JIT its code as 64-bit but then it was trying to load the unmanaged DLLs which were 32-bit and, hence, failing.&lt;/p&gt; &lt;p&gt;Because we didn't have the source for this code, we solved the problem by running &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;corflags.exe /32BIT+&lt;/strong&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;on the executable which changes the header to say to the CLR "I want to JIT 32-bit code please" as though the original builder of the software had selected &lt;strong&gt;x86&lt;/strong&gt; rather than "Any CPU" in Visual Studio.&lt;/p&gt; &lt;p&gt;This worked a treat in this specific instance - definitely one for me to remember and so I'm storing it here.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10807" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/01/10807.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10807.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10807</guid>
      <pubDate>Wed, 01 Oct 2008 17:06:30 GMT</pubDate>
    </item>
    <item>
      <title>WPF DataGrid and Hiding Columns</title>
      <description>&lt;p&gt;Looking for advice here :-) I find that in the WPF/Silverlight DataGrids there's this option which is really useful;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;AutoGenerateColumns="true/false"&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;but I generally don't want either &lt;strong&gt;true&lt;/strong&gt; or &lt;strong&gt;false&lt;/strong&gt;. What I seem to want is;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Autogenerate all of them but I don't want to display columns A,B,C"&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;and I'm not sure how I do that. I ended up deriving my own DataGrid just to try and make that work as in;&lt;/p&gt;&lt;pre class="csharpcode"&gt;  [ContentProperty(&lt;span class="str"&gt;"Name"&lt;/span&gt;)]
  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; HiddenColumn
  {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; HiddenColumn()
    {
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }
  }
  &lt;span class="kwrd"&gt;class&lt;/span&gt; HideableDataGrid : DataGrid
  {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; HideableDataGrid()
    {
      HiddenColumns = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;HiddenColumn&amp;gt;();
      &lt;span class="kwrd"&gt;this&lt;/span&gt;.AutoGeneratingColumn += OnGeneratingColumn;
    }

    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnGeneratingColumn(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DataGridAutoGeneratingColumnEventArgs e)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt; (HiddenColumns != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
      {
        e.Cancel = HiddenColumns.Exists(hc =&amp;gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Compare(e.PropertyName, hc.Name, &lt;span class="kwrd"&gt;true&lt;/span&gt;) == 0);
      }
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;HiddenColumn&amp;gt; HiddenColumns { get; set; }
  }&lt;/pre&gt;
&lt;p&gt;and then use that as in;&lt;/p&gt;&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:HideableDataGrid&lt;/span&gt;
      &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="ordersGrid"&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;
      &lt;span class="attr"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span class="kwrd"&gt;="True"&lt;/span&gt;
      &lt;span class="attr"&gt;DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding ElementName=customersGrid,Path=SelectedValue.Orders}"&lt;/span&gt;
      &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding}"&lt;/span&gt;
      &lt;span class="attr"&gt;InitializingNewItem&lt;/span&gt;&lt;span class="kwrd"&gt;="OnOrdersGridRowInsert"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:HideableDataGrid.HiddenColumns&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:HiddenColumn&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;CustomerID&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;local:HiddenColumn&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:HiddenColumn&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;CompanyName&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;local:HiddenColumn&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:HiddenColumn&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;OrderID&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;local:HiddenColumn&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;local:HideableDataGrid.HiddenColumns&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;local:HideableDataGrid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;but this &lt;strong&gt;can't&lt;/strong&gt; be the right thing to do here? ( + the naming I've given the derived class is horrible ).&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10800" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/01/10800.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10800.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10800</guid>
      <pubDate>Wed, 01 Oct 2008 10:25:51 GMT</pubDate>
    </item>
    <item>
      <title>More on .NET 4.0 along with some &amp;quot;Oslo&amp;quot; and a little &amp;quot;Dublin&amp;quot;</title>
      <description>&lt;p&gt;From &lt;a href="http://blogs.msdn.com/stevemar/archive/2008/10/01/the-road-to-pdc-net-framework-4-0-and-dublin.aspx"&gt;this blog post&lt;/a&gt;, check out the &lt;a href="http://download.microsoft.com/download/5/9/b/59b74a2a-245d-4304-802e-e0a0800facd3/Dublin__NET_4_overview.docx"&gt;whitepaper&lt;/a&gt; and the &lt;a href="http://wm.microsoft.com/ms/msdn/wf/dublin_Analyst_Webcast.wmv"&gt;webcast&lt;/a&gt; as well.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10797" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/01/10797.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10797.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10797</guid>
      <pubDate>Wed, 01 Oct 2008 09:27:23 GMT</pubDate>
    </item>
    <item>
      <title>DataGrid - Master/Details</title>
      <description>&lt;p&gt;Following on from that previous post about the &lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/30/10794.aspx"&gt;WPF DataGrid&lt;/a&gt; I thought it might be interesting to try and move towards more of a master/details view with a separate grid displaying the orders for each customer.&lt;/p&gt; &lt;p&gt;I modified the UI a little bit;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;
  &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="BlogPost.Window1"&lt;/span&gt;
  &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;
  &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;
  &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="Window1"&lt;/span&gt;
  &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="600"&lt;/span&gt;
  &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="800"&lt;/span&gt;
  &lt;span class="attr"&gt;xmlns:grid&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/wpf/2008/toolkit"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;
        &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;="myStyle"&lt;/span&gt;
        &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;="{x:Type Control}"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt;
          &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;="Margin"&lt;/span&gt;
          &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt;
          &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;="FontSize"&lt;/span&gt;
          &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;="16"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="Auto"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt;
        &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="2*"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt;
        &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="2*"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="Auto"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt;
      &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="txtCountry"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;      
      &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Country}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;grid:DataGrid&lt;/span&gt;
      &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="customersGrid"&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;
      &lt;span class="attr"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span class="kwrd"&gt;="True"&lt;/span&gt;
      &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding}"&lt;/span&gt; 
      &lt;span class="attr"&gt;InitializingNewItem&lt;/span&gt;&lt;span class="kwrd"&gt;="OnCustomersGridRowInsert"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;GridSplitter&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt; &lt;span class="attr"&gt;HorizontalAlignment&lt;/span&gt;&lt;span class="kwrd"&gt;="Stretch"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;grid:DataGrid&lt;/span&gt;
      &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="ordersGrid"&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;
      &lt;span class="attr"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span class="kwrd"&gt;="True"&lt;/span&gt;
      &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding ElementName=customersGrid,Path=SelectedValue.Orders}"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="3"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;
      &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Submit Changes"&lt;/span&gt;
      &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="OnSubmitChanges"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There's something really simple and really smart going on in the UI. Notice that the second grid ( &lt;strong&gt;ordersGrid&lt;/strong&gt; ) is simply declaratively binding its &lt;strong&gt;ItemsSource&lt;/strong&gt; to the property &lt;strong&gt;SelectedValue.Orders&lt;/strong&gt; of the &lt;strong&gt;customersGrid.&lt;/strong&gt; Pretty smart.&lt;/p&gt;
&lt;p&gt;I also updated the code behind a little bit ( I think I removed one or two functions to make it smaller ) to end up with;&lt;/p&gt;&lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Window1 : Window, INotifyPropertyChanged
  {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Window1()
    {
      InitializeComponent();

      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Loaded += OnLoaded;
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLoaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
    {
      &lt;span class="rem"&gt;// Note, letting the orders lazily load.&lt;/span&gt;
      dataContext = &lt;span class="kwrd"&gt;new&lt;/span&gt; NorthwindDataContext();

      txtCountry.DataContext = &lt;span class="kwrd"&gt;this&lt;/span&gt;;
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Country 
    {
      get
      {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; (country);
      }
      set
      {
        country = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
        Requery();
        FirePropertyChanged(&lt;span class="str"&gt;"Country"&lt;/span&gt;);
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; Requery()
    {
      customersGrid.DataContext = dataContext.Customers.Where(c =&amp;gt; c.Country == txtCountry.Text);
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnCustomersGridRowInsert(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, InitializingNewItemEventArgs e)
    {
      Customer c = e.NewItem &lt;span class="kwrd"&gt;as&lt;/span&gt; Customer;

      &lt;span class="kwrd"&gt;if&lt;/span&gt; (c != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
      {
        c.Country = txtCountry.Text;
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; FirePropertyChanged(&lt;span class="kwrd"&gt;string&lt;/span&gt; property)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
      {
        PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(property));
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnSubmitChanges(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs args)
    {
      &lt;span class="rem"&gt;// This needs error handling in the real world.&lt;/span&gt;
      dataContext.SubmitChanges();
    }
    NorthwindDataContext dataContext;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; country;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
  }
&lt;/pre&gt;
&lt;p&gt;That gives me a working UI in that I can display data;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/DataGridMasterDetails_965F/image.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/DataGridMasterDetails_965F/image_thumb.png" width="244" height="184"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;and also, within reason, I can update data. What I mean by "within reason" is that I'm not sure how well this would respond to me changing (e.g.) a foreign key value but then it's perhaps pretty dubious for me to be displaying that to the user in the first place.&lt;/p&gt;
&lt;p&gt;Note that I'm quite happily letting LINQ to SQL do lazy loading on the &lt;strong&gt;Orders&lt;/strong&gt; property of the &lt;strong&gt;Customer&lt;/strong&gt; entity rather than pre-loading all of those orders for the customers.&lt;/p&gt;
&lt;p&gt;I can also go ahead and insert new customers and orders for those customers into this grid - works pretty well in that I can go and create a new customer on that top grid and then add an order to it on that bottom grid by just filling in some value ( the &lt;strong&gt;freight&lt;/strong&gt; in this case );&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/DataGridMasterDetails_965F/image_3.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/DataGridMasterDetails_965F/image_thumb_3.png" width="244" height="173"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;and then submit my changes and that works exactly as you'd expect. The interesting thing here is that LINQ to SQL goes ahead and requeries for the &lt;strong&gt;OrderID&lt;/strong&gt; of the inserted order and then the change notification fires and so my new order ID automatically appears on the screen. However, the new &lt;strong&gt;CustomerID&lt;/strong&gt; doesn't appear on there which feels a little strange.&lt;/p&gt;
&lt;p&gt;However, if I navigate to another order ( even before calling SubmitChanges ) and then back again the &lt;strong&gt;CustomerID&lt;/strong&gt; is correctly set as below;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/DataGridMasterDetails_965F/image_4.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/DataGridMasterDetails_965F/image_thumb_4.png" width="244" height="173"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;So what's happening there? When we call submit changes we go an do an insert into the &lt;strong&gt;Orders&lt;/strong&gt; table in the database and then LINQ to SQL will requery for the identity column ( orderId ) by using &lt;strong&gt;scope_identity().&lt;/strong&gt; It then sets this on my new order object which causes a property change notification to be fired into the grid which works fine.&lt;/p&gt;
&lt;p&gt;But this is &lt;strong&gt;not&lt;/strong&gt; how the &lt;strong&gt;CustomerID&lt;/strong&gt; is being set on that order. The &lt;strong&gt;CustomerID&lt;/strong&gt; is never set via the property setter. It's set much earlier before we get anywhere near to &lt;strong&gt;SubmitChanges. &lt;/strong&gt;What happens is that the &lt;strong&gt;Customer&lt;/strong&gt; is set on the &lt;strong&gt;Order&lt;/strong&gt; and the generated code goes and sets the &lt;strong&gt;CustomerID&lt;/strong&gt; field but not the property meaning that you don't get property change notification so the grid doesn't update at the time that the &lt;strong&gt;CustomerID&lt;/strong&gt; gets set.&lt;/p&gt;
&lt;p&gt;What I ended up doing was to modify my code a little so that it picks up any inserted order from the &lt;strong&gt;DataGrid&lt;/strong&gt; &lt;strong&gt;InitializingNewItem&lt;/strong&gt; event and it syncs up to any change on the &lt;strong&gt;Customer&lt;/strong&gt; on that newly inserted item and when it detects a change to the &lt;strong&gt;Customer&lt;/strong&gt; it forces the &lt;strong&gt;Order&lt;/strong&gt; to also send a &lt;strong&gt;CustomerID&lt;/strong&gt; property change notification. &lt;/p&gt;
&lt;p&gt;That meant modifying the definition of my &lt;strong&gt;ordersGrid;&lt;/strong&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;grid:DataGrid&lt;/span&gt;
      &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="ordersGrid"&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;
      &lt;span class="attr"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span class="kwrd"&gt;="True"&lt;/span&gt;
      &lt;span class="attr"&gt;DataContext&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding ElementName=customersGrid,Path=SelectedValue.Orders}"&lt;/span&gt;
      &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding}"&lt;/span&gt;
      &lt;span class="attr"&gt;InitializingNewItem&lt;/span&gt;&lt;span class="kwrd"&gt;="OnOrdersGridRowInsert"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;and then modifying my code behind a little in a few places. I modified the &lt;strong&gt;Order&lt;/strong&gt; class by adding a partial method which will allow me to call its (protected) &lt;strong&gt;SendPropertyChanged&lt;/strong&gt; method;&lt;/p&gt;&lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Order : INotifyPropertyChanging, INotifyPropertyChanged
  {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ForcePropertyChanged(&lt;span class="kwrd"&gt;string&lt;/span&gt; property)
    {
      SendPropertyChanged(property);
    }
  }
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;and I added a couple of more pieces to my code behind class;&lt;/p&gt;&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnOrdersGridRowInsert(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, InitializingNewItemEventArgs e)
    {
      Order o = e.NewItem &lt;span class="kwrd"&gt;as&lt;/span&gt; Order;

      &lt;span class="kwrd"&gt;if&lt;/span&gt; (o != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
      {
        o.PropertyChanged += OnOrderPropertyChanged;
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnOrderPropertyChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, PropertyChangedEventArgs e)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.PropertyName == &lt;span class="str"&gt;"Customer"&lt;/span&gt;)
      {
        Order o = sender &lt;span class="kwrd"&gt;as&lt;/span&gt; Order;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (o != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
          o.ForcePropertyChanged(&lt;span class="str"&gt;"CustomerID"&lt;/span&gt;);
          o.PropertyChanged -= OnOrderPropertyChanged;
        }
      }
    }
&lt;/pre&gt;and now it's all working the way I'd expect with respect to Inserts. I'm not at all sure that this is a "good" way of achieving this, though.
&lt;p&gt;What about deletes? I can select a bunch of orders and delete them and that seems to work just fine and if I delete orders and their corresponding customer then that works as well.&lt;/p&gt;
&lt;p&gt;Where it fails ( as you might expect ) is if I delete a customer without doing anything with the related orders. If I want to make that work then I can modify the code a little. I did this by modifying the UI code - didn't find it quite as easy as I would have liked in that I &lt;strong&gt;&lt;em&gt;seem&lt;/em&gt;&lt;/strong&gt; to have to go down to the route of grabbing an &lt;strong&gt;ICollectionView&lt;/strong&gt; from the &lt;strong&gt;customersGrid&lt;/strong&gt; and then waiting for its &lt;strong&gt;CollectionChanged&lt;/strong&gt; event whereas I was perhaps expecting the &lt;strong&gt;DataGrid&lt;/strong&gt; to have some kind of &lt;strong&gt;Deleted&lt;/strong&gt; event. Here's the code I ended up with;&lt;/p&gt;&lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Window1 : Window, INotifyPropertyChanged
  {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Window1()
    {
      InitializeComponent();

      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Loaded += OnLoaded;
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Country 
    {
      get
      {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; (country);
      }
      set
      {
        country = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
        Requery();
        FirePropertyChanged(&lt;span class="str"&gt;"Country"&lt;/span&gt;);
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLoaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
    {
      &lt;span class="rem"&gt;// Note, letting the orders lazily load.&lt;/span&gt;
      dataContext = &lt;span class="kwrd"&gt;new&lt;/span&gt; NorthwindDataContext();
      txtCountry.DataContext = &lt;span class="kwrd"&gt;this&lt;/span&gt;;
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; Requery()
    {
      customersGrid.DataContext = dataContext.Customers.Where(c =&amp;gt; c.Country == txtCountry.Text);
      ICollectionView colView = CollectionViewSource.GetDefaultView(customersGrid.DataContext);
      colView.CollectionChanged += OnCustomerListModified;
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnCustomerListModified(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.Action == NotifyCollectionChangedAction.Remove)
      {
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;object&lt;/span&gt; o &lt;span class="kwrd"&gt;in&lt;/span&gt; e.OldItems)
        {
          Customer c = o &lt;span class="kwrd"&gt;as&lt;/span&gt; Customer;

          &lt;span class="kwrd"&gt;if&lt;/span&gt; ((c != &lt;span class="kwrd"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; (c.Orders != &lt;span class="kwrd"&gt;null&lt;/span&gt;))
          {
            dataContext.Orders.DeleteAllOnSubmit(c.Orders);
          }
        }
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnCustomersGridRowInsert(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, InitializingNewItemEventArgs e)
    {
      Customer c = e.NewItem &lt;span class="kwrd"&gt;as&lt;/span&gt; Customer;

      &lt;span class="kwrd"&gt;if&lt;/span&gt; (c != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
      {
        c.Country = txtCountry.Text;
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnOrdersGridRowInsert(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, InitializingNewItemEventArgs e)
    {
      Order o = e.NewItem &lt;span class="kwrd"&gt;as&lt;/span&gt; Order;

      &lt;span class="kwrd"&gt;if&lt;/span&gt; (o != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
      {
        o.PropertyChanged += OnOrderPropertyChanged;
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnOrderPropertyChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, PropertyChangedEventArgs e)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.PropertyName == &lt;span class="str"&gt;"Customer"&lt;/span&gt;)
      {
        Order o = sender &lt;span class="kwrd"&gt;as&lt;/span&gt; Order;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (o != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
          o.ForcePropertyChanged(&lt;span class="str"&gt;"CustomerID"&lt;/span&gt;);
          o.PropertyChanged -= OnOrderPropertyChanged;
        }
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; FirePropertyChanged(&lt;span class="kwrd"&gt;string&lt;/span&gt; property)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
      {
        PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(property));
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnSubmitChanges(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs args)
    {
      &lt;span class="rem"&gt;// This needs error handling in the real world.&lt;/span&gt;
      dataContext.SubmitChanges();      
    }
    NorthwindDataContext dataContext;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; country;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
  }
&lt;/pre&gt;
&lt;p&gt;and, in fact, here's the &lt;a href="http://mtaulty.com/downloads/WpfDataGridMasterDetail.zip"&gt;whole project for download should you want the source code&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10798" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/10/01/10798.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10798.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10798</guid>
      <pubDate>Wed, 01 Oct 2008 09:38:02 GMT</pubDate>
    </item>
    <item>
      <title>Surprised by WPF DataGrid :-)</title>
      <description>&lt;p&gt;Here's what I did. I took the WPF &lt;a href="http://www.codeplex.com/wpf/Release/ProjectReleases.aspx?ReleaseId=14963"&gt;DataGrid&lt;/a&gt; and used it in my project. More specifically;&lt;/p&gt; &lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_thumb.png" width="244" height="202"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Then add a reference to the DataGrid's assembly ( I have mine in d:\wpftoolkit\ );&lt;/p&gt; &lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_3.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_thumb_3.png" width="244" height="197"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Then "built a UI" which is an overstatement :-)&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;
  &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="BlogPost.Window1"&lt;/span&gt;
  &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;
  &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;
  &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="Window1"&lt;/span&gt;
  &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="600"&lt;/span&gt;
  &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="800"&lt;/span&gt;
  &lt;span class="attr"&gt;xmlns:grid&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/wpf/2008/toolkit"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;
        &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;="myStyle"&lt;/span&gt;
        &lt;span class="attr"&gt;TargetType&lt;/span&gt;&lt;span class="kwrd"&gt;="{x:Type Control}"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt;
          &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;="Margin"&lt;/span&gt;
          &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;="10"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Setter&lt;/span&gt;
          &lt;span class="attr"&gt;Property&lt;/span&gt;&lt;span class="kwrd"&gt;="FontSize"&lt;/span&gt;
          &lt;span class="attr"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;="16"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.Resources&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt;
        &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="4*"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;RowDefinition&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBox&lt;/span&gt;
      &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="txtCountry"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;      
      &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding Country}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;grid:DataGrid&lt;/span&gt;
      &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="dataGrid"&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;
      &lt;span class="attr"&gt;AutoGenerateColumns&lt;/span&gt;&lt;span class="kwrd"&gt;="True"&lt;/span&gt;
      &lt;span class="attr"&gt;ItemsSource&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Button&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;Row&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt;
      &lt;span class="attr"&gt;Style&lt;/span&gt;&lt;span class="kwrd"&gt;="{StaticResource myStyle}"&lt;/span&gt;
      &lt;span class="attr"&gt;Content&lt;/span&gt;&lt;span class="kwrd"&gt;="Submit Changes"&lt;/span&gt;
      &lt;span class="attr"&gt;Click&lt;/span&gt;&lt;span class="kwrd"&gt;="OnSubmitChanges"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;And then added some LINQ to SQL classes from my Northwind database;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_4.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_thumb_4.png" width="244" height="171"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;and dropped in all the tables;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_5.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_thumb_5.png" width="244" height="155"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;then went and edited my code behind for my XAML file;&lt;/p&gt;&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Window1 : Window, INotifyPropertyChanged
  {
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Window1()
    {
      InitializeComponent();

      &lt;span class="kwrd"&gt;this&lt;/span&gt;.Loaded += OnLoaded;
    }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Country 
    {
      get
      {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; (country);
      }
      set
      {
        country = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
        Requery();
        FirePropertyChanged(&lt;span class="str"&gt;"Country"&lt;/span&gt;);
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; Requery()
    {
      dataGrid.DataContext = dataContext.Customers.Where(c =&amp;gt; c.Country == txtCountry.Text);
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLoaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
    {
      dataContext = &lt;span class="kwrd"&gt;new&lt;/span&gt; NorthwindDataContext();
      txtCountry.DataContext = &lt;span class="kwrd"&gt;this&lt;/span&gt;;
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; FirePropertyChanged(&lt;span class="kwrd"&gt;string&lt;/span&gt; property)
    {
      &lt;span class="kwrd"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
      {
        PropertyChanged(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(property));
      }
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnSubmitChanges(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs args)
    {
      &lt;span class="rem"&gt;// This needs error handling in the real world.&lt;/span&gt;
      dataContext.SubmitChanges();
    }
    NorthwindDataContext dataContext;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; country;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
  }&lt;/pre&gt;
&lt;p&gt;and what surprised me was that I got more than I bargained for with this DataGrid.&lt;/p&gt;
&lt;p&gt;I expected it to behave just like the one in Silverlight 2 Beta 2 ( it may have changed for the RC, I haven't checked yet ) in that I expected the grid to do a fine job of displaying (and updating) the data but I expected it to do nothing around insert or delete because that was my previous experience with the Silverlight 2 Beta 2 DataGrid.&lt;/p&gt;
&lt;p&gt;However, here it's different!&lt;/p&gt;
&lt;p&gt;Firstly, I should say that Update works. That is, I can go and bring up the UI, set a country (by typing and tabbing).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_6.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_thumb_6.png" width="244" height="110"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Note that my Northwind DB is very much broken in terms of the data it contains but, regardless, I can make an update;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_7.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_thumb_7.png" width="244" height="110"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;and then click "Submit Changes" and that just works.&lt;/p&gt;
&lt;p&gt;However, I can also do an insert by typing into the blank row at the bottom of the grid to create a new row (note - it's a bit weird to create a new row here because I have a filter for Spain so I really should force the Country to be Spain or at least default it). I'll come back to that in a second. In the meantime I can do;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_8.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_thumb_8.png" width="244" height="184"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;and then click Submit Changes and that submits a record for me and I can also highlight that new row,&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_9.png"&gt;&lt;img border="0" alt="image" src="http://mtaulty.com/blog/images/SurprisedbyWPFDataGrid_14D2A/image_thumb_9.png" width="244" height="184"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;and then press the DELete key and then "Submit Changes" and that deletes the row for me.&lt;/p&gt;
&lt;p&gt;Magic! But how on Earth does that work?&lt;/p&gt;
&lt;p&gt;The first thing to think about is that I'm setting the &lt;strong&gt;DataContext&lt;/strong&gt; on the &lt;strong&gt;DataGrid&lt;/strong&gt; to an &lt;strong&gt;IQueryable&amp;lt;Customer&amp;gt;&lt;/strong&gt; and then the &lt;strong&gt;DataGrid&lt;/strong&gt; is going to cause the query to be enumerated. How does it do that?&lt;/p&gt;
&lt;p&gt;I think what happens is that we set the &lt;strong&gt;DataContext&lt;/strong&gt; to a &lt;strong&gt;DataQuery&amp;lt;Customer&amp;gt;&lt;/strong&gt; which is an internal class of LINQ to SQL implementing &lt;strong&gt;IQueryable&lt;/strong&gt;. This also implements &lt;strong&gt;IListSource&lt;/strong&gt; and the &lt;strong&gt;DataGrid&lt;/strong&gt; calls into that implementation's &lt;strong&gt;GetList() &lt;/strong&gt;function which looks to ultimately cause the creation of something that is derived from &lt;strong&gt;BindingList&amp;lt;Customer&amp;gt;&lt;/strong&gt; and from thereon we're in business in that the &lt;strong&gt;DataGrid&lt;/strong&gt; can (and does) call into &lt;strong&gt;InsertItem, RemoveItem&lt;/strong&gt; in order to do its Inserts/Deletes.&lt;/p&gt;
&lt;p&gt;I guess the last mystery is how I ensure that when someone has typed "Spain" into my UI then if they insert a row then the country should be set to "Spain" ( at the very least ).&lt;/p&gt;
&lt;p&gt;I found a handy &lt;strong&gt;InitializingNewItem&lt;/strong&gt; event and used that to initialise things (just pasting the 1 new/1 modified function below);&lt;/p&gt;&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLoaded(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
    {
      dataContext = &lt;span class="kwrd"&gt;new&lt;/span&gt; NorthwindDataContext();
      txtCountry.DataContext = &lt;span class="kwrd"&gt;this&lt;/span&gt;;
      dataGrid.InitializingNewItem += OnGridRowInsert;
    }
    &lt;span class="kwrd"&gt;void&lt;/span&gt; OnGridRowInsert(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, InitializingNewItemEventArgs e)
    {
      ((Customer)e.NewItem).Country = txtCountry.Text;
    }&lt;/pre&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10794" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/30/10794.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10794.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10794</guid>
      <pubDate>Tue, 30 Sep 2008 16:20:04 GMT</pubDate>
    </item>
    <item>
      <title>10</title>
      <description>&lt;p&gt;There's a video up on C9 ( largely around Team System ) which announces that the next version of Visual Studio will be 2010 and the next version of the Framework will be V4.0.&lt;/p&gt; &lt;p&gt;They can't decide whether to pronounce this;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Two thousand and ten"&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;or&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Twenty Ten"&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;but I think I just like;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Visual Studio &lt;strong&gt;Ten&lt;/strong&gt;"&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;As part of the same video, there's the announcement that Visual Studio Team System for &lt;strong&gt;Developers &lt;/strong&gt;is being integrated with Visual Studio Team System for &lt;strong&gt;Database&lt;/strong&gt; - i.e. those 2 things are now packaged together and you can go up &lt;a href="http://msdn.microsoft.com/en-us/vstudio/products/cc948977.aspx"&gt;here to find out more information&lt;/a&gt; as to how that affects you if you have either of those editions ( it's good news as you get the other tool :-) ).&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10792" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/29/10792.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10792.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10792</guid>
      <pubDate>Mon, 29 Sep 2008 07:11:13 GMT</pubDate>
    </item>
    <item>
      <title>PC Speakers</title>
      <description>&lt;p&gt;I seem to be working my way down &lt;a href="http://reviews.cnet.com/best-pc-speakers/?tag=ltcol;nav"&gt;Cnet's review of PC speakers&lt;/a&gt;. In my office, I have these;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;img src="http://i.i.com.com/cnwk.1d/sc/30993080-2-200-0.gif"&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;which I've had for quite a long time and really like and I just got myself a set of these below to attach to the Media Center ( deliberately trying to avoid ending up with a big sub-woofer under my TV or going back to the 5.1 setup I've had in the past which takes over the whole lounge );&lt;/p&gt; &lt;p&gt;&lt;img src="http://i.i.com.com/cnwk.1d/sc/32381162-2-200-0.gif"&gt; &lt;/p&gt; &lt;p&gt;and, so far, they sound very nice ( I went for the 30W rather than the 40W ).&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10793" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/29/10793.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10793.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10793</guid>
      <pubDate>Mon, 29 Sep 2008 07:21:19 GMT</pubDate>
    </item>
    <item>
      <title>jQuery to ship with Visual Studio</title>
      <description>&lt;p&gt;I &lt;a href="http://blogs.msdn.com/mikeormond/archive/2008/07/24/getting-twitter-updates-on-my-blog.aspx"&gt;posted a little while back&lt;/a&gt; about how much I liked &lt;a href="http://docs.jquery.com/Main_Page"&gt;jQuery&lt;/a&gt; so I was excited (not to mention surprised) to read that we're going to be &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx"&gt;shipping jQuery with Visual Studio in the near future&lt;/a&gt;. Not only that but we'll have a special annotated version of the library to get the best possible Intellisense support. How cool is that? There are a number of posts and demos floating around:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://weblogs.asp.net/bleroy/archive/2008/09/28/jquery-now-officially-part-of-the-net-developer-s-toolbox.aspx"&gt;Bertrand Le Roy&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://jquery.com/blog/2008/09/28/jquery-microsoft-nokia/"&gt;John Resig&lt;/a&gt; (jQuery team blog)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.hanselman.com/blog/jQuerytoshipwithASPNETMVCandVisualStudio.aspx"&gt;Scott Hanselman&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Scott's demo also uses the &lt;a href="http://weblogs.asp.net/bleroy/archive/2008/07/30/using-client-templates-part-1.aspx"&gt;client templates work&lt;/a&gt; that's in the &lt;a href="http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=15511"&gt;ASP.NET AJAX 4.0 CodePlex Preview 1 release&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Lots of great stuff for web developers in the pipeline!&lt;/p&gt;  &lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:54cf6544-6d5b-40a1-8a5e-ca49a2498891" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/asp.net" rel="tag"&gt;asp.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/jquery" rel="tag"&gt;jquery&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ajax" rel="tag"&gt;ajax&lt;/a&gt;,&lt;a href="http://technorati.com/tags/visual%20studio" rel="tag"&gt;visual studio&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8968564" width="1" height="1"&gt;</description>
      <link>http://blogs.msdn.com/mikeormond/archive/2008/09/29/jquery-to-ship-with-visual-studio.aspx</link>
      <source url="http://blogs.msdn.com/mikeormond/default.aspx">Mike Ormond's Blog</source>
      <comments>http://blogs.msdn.com/mikeormond/comments/8968564.aspx</comments>
      <guid isPermaLink="False">91d46819-8472-40ad-a661-2c78acb4018c:8968564</guid>
      <pubDate>Mon, 29 Sep 2008 00:27:05 GMT</pubDate>
    </item>
    <item>
      <title>Silverlight 2 Release Candidate Available</title>
      <description>&lt;p&gt;We've &lt;a href="http://silverlight.net/GetStarted/sl2rc0.aspx"&gt;released RC0 of Silverlight 2&lt;/a&gt;. This is intended as a developer only release - neither the Silverlight 1 nor Silverlight 2 Beta 2 plug-in will auto-update to this release. This is an opportunity to test your Silverlight 2 applications against RC0 to ensure they will be ready for final release. There is also a preview of SP1 for Expression Blend which targets Silverlight 2 RC0.&lt;/p&gt;  &lt;p&gt;There is a full list of &lt;a href="http://download.microsoft.com/download/6/f/e/6fe1f43d-9d0c-4346-ad08-602df9bcb3cf/BreakingChangesBetweenBeta2andRelease.doc"&gt;breaking changes&lt;/a&gt; between B2 and RC0, I've pulled out the contents list below as a summary:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Important! Migrating Older Code to the Newer Release&lt;/li&gt;    &lt;li&gt;ContentPresenter now derives from FrameworkElement instead of Control&lt;/li&gt;    &lt;li&gt;Layout Rendering Slightly Changed&lt;/li&gt;    &lt;li&gt;Cross domain hosts of Silverlight must set the right MIME type for XAP (application/x-silverlight-app)&lt;/li&gt;    &lt;li&gt;Exceptions now thrown in HttpWebRequest.EndGetResponse()&lt;/li&gt;    &lt;li&gt;Font URI is Restricted to Assembly Resource&lt;/li&gt;    &lt;li&gt;Browser.HtmlElementCollection replaced with by Browser.ScriptObjectCollection&lt;/li&gt;    &lt;li&gt;Exceptions When Changing Some Properties on an Active Animation&lt;/li&gt;    &lt;li&gt;System.Windows.Controls.Extended.dll renamed to System.Windows.Controls.dll&lt;/li&gt;    &lt;li&gt;VisualStateManager Changes&lt;/li&gt;    &lt;li&gt;KeyDown Sent Synchronously&lt;/li&gt;    &lt;li&gt;MeasureOverride/ArrangeOverride on Canvas Now Sealed&lt;/li&gt;    &lt;li&gt;UriTypeConverter moved to System.dll&lt;/li&gt;    &lt;li&gt;HtmlPage.UnregisterScriptableObject Removed&lt;/li&gt;    &lt;li&gt;RenderingEventArgs Changes&lt;/li&gt;    &lt;li&gt;ContentPresenter and ContentControl Changes&lt;/li&gt;    &lt;li&gt;Removal of FileDialogFileInfo Type and OpenFileDialog.SelectedFile(s) Properties&lt;/li&gt;    &lt;li&gt;Removal of FullAccess Option on the ExternalCallersFromCrossDomain attribute in the Silverlight 2 application manifest&lt;/li&gt;    &lt;li&gt;KeyFrameCollection Changes&lt;/li&gt;    &lt;li&gt;Request stream must be closed before calling HttpWebRequest.BeginGetResponse()&lt;/li&gt;    &lt;li&gt;HtmlWindow references on Safari/Mac will no longer evaluate to true&lt;/li&gt;    &lt;li&gt;Address property removed from all WebClient EventArg classes&lt;/li&gt;    &lt;li&gt;Constructors Made Internal&lt;/li&gt;    &lt;li&gt;Exception type change for System.Xml exception type&lt;/li&gt;    &lt;li&gt;Cannot create classes in XAML that do not have accessible constructors&lt;/li&gt;    &lt;li&gt;Get AG_E_UNKNOWN_ERROR in Silverlight 2 but not in Silverlight 1&lt;/li&gt;    &lt;li&gt;Platform looks for generic.xaml as a resource at themes/generic.xaml&lt;/li&gt;    &lt;li&gt;HTTP Polling Duplex OM Changes and Reengineering&lt;/li&gt;    &lt;li&gt;Breaking change to Silverlight native hosting IXcpControl COM interface&lt;/li&gt;    &lt;li&gt;Content-Type is allowed on cross domain request by default&lt;/li&gt;    &lt;li&gt;Enforcing delegate type check when two delegate objects are combined&lt;/li&gt;    &lt;li&gt;Miscellaneous API Changes&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;All the relevant links and downloads are &lt;a href="http://silverlight.net/GetStarted/sl2rc0.aspx"&gt;available on Silverlight.Net&lt;/a&gt;.&lt;/p&gt;  &lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c2103e86-1fff-4834-80b4-985c931370f0" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/silverlight" rel="tag"&gt;silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/expression" rel="tag"&gt;expression&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8966115" width="1" height="1"&gt;</description>
      <link>http://blogs.msdn.com/mikeormond/archive/2008/09/26/silverlight-2-release-candidate-available.aspx</link>
      <source url="http://blogs.msdn.com/mikeormond/default.aspx">Mike Ormond's Blog</source>
      <comments>http://blogs.msdn.com/mikeormond/comments/8966115.aspx</comments>
      <guid isPermaLink="False">91d46819-8472-40ad-a661-2c78acb4018c:8966115</guid>
      <pubDate>Fri, 26 Sep 2008 00:39:58 GMT</pubDate>
    </item>
    <item>
      <title>Silverlight 2 RC Available</title>
      <description>&lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/25/silverlight-2-release-candidate-now-available.aspx"&gt;From ScottGu&lt;/a&gt; - key thing here is that there are Beta 2-&amp;gt;RTM breaking changes so if you have applications on Silverlight 2 Beta 2 then you need to see about moving them over to the RC in order that they'll run when we get to RTM.&lt;/p&gt; &lt;p&gt;Also noted - new controls for ComboBox, ProgressBar and PasswordBox and all controls have a better look/feel by default.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10791" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/26/10791.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10791.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10791</guid>
      <pubDate>Fri, 26 Sep 2008 01:39:57 GMT</pubDate>
    </item>
    <item>
      <title>Shuttle D10 with Touch-Screen</title>
      <description>&lt;p&gt;Hmm, &lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/25/10785.aspx"&gt;speaking of Shuttle&lt;/a&gt; caused me to go looking at what they're currently selling.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.slashgear.com/shuttle-d10-desktop-has-touchscreen-built-in-1916710/"&gt;This looks really interesting to me&lt;/a&gt;. If you go with a "living room" Media Center then one of the odd things about it is the idea that you need to switch on your TV in order to listen to some music. You switch on the Media Center, switch on the TV, choose an album and then probably switch off the TV as that seems a bit wasteful.&lt;/p&gt; &lt;p&gt;Having the touch-screen on there seems like a nice idea. I know there are various &lt;a href="http://www.quietpc.com/gb-en-gbp/products/htpccases"&gt;other cases that do this&lt;/a&gt; but this one looks pretty nice and I'm quite keen on Shuttles.&lt;/p&gt; &lt;p&gt;The downside looks to be that there's only one card-slot in there. A single PCI-E card slot to take a TV tuner which is fine as long as you never want to replace the integrated graphics ( e.g. to get an HDMI output or perhaps to take on Blu-Ray at some point ) although you could perhaps drop to an external USB tuner to free up a slot. &lt;/p&gt; &lt;p&gt;Mmmm.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10787" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/25/10787.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10787.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10787</guid>
      <pubDate>Thu, 25 Sep 2008 16:48:55 GMT</pubDate>
    </item>
    <item>
      <title>GeForce 6200 in my Vista Sp1 Media Center</title>
      <description>&lt;p&gt;One of the very best things about Vista is Media Center.&lt;/p&gt; &lt;p&gt;You never really hear people talk about Media Center when they talk about Vista but Media Center is one app that I can easily put hand on heart and say that, for me, in Vista it's 100% better than it was in XP. It runs my TV and it does it really well.&lt;/p&gt; &lt;p&gt;It records the TV I ask it to and it does it around 99% of the time I'd say whereas with XP (on the same machine I hasten to add) it was about 65% of the time. It was always coming up with excuses about why it'd failed to record some series or other.&lt;/p&gt; &lt;p&gt;So, I thought I'd give my Media Center a bit of a treat and get it a new graphics card. It'd been running with an FX 5200 with (IIRC) 128MB or RAM in it and I'd like to give it a stunning card but;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;They're noisy. This box is under my TV.&lt;/li&gt; &lt;li&gt;They're expensive.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;So I bought another cheap card - a 6200 seeing that nVidia actually mention the 6 series on their website whereas they long since stopped mentioning the 5 series which made it tricky to find a driver beyond the in-the-Vista-box driver.&lt;/p&gt; &lt;p&gt;I slotted this into the Shuttle PC that's my Media Center. 3 minute job to switch the card. Then a 3+ hour job to try and figure out why installing the NVidia drivers for the card left Vista saying;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"I can't use this card, error code 43. It fails on start-up"&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;whereas if I leave the standard in-the-box Microsoft driver for the 6200 it works but the "performance rating" comes out really badly and that driver seemed to have a date of 2006 stamped on it.&lt;/p&gt; &lt;p&gt;Checking out the &lt;a href="http://forums.nvidia.com/index.php?s=86b78e3f23707b5fa1b543751027adde&amp;amp;showforum=33"&gt;nVidia drivers forum&lt;/a&gt; revealed that I should have done some looking before buying the 6200. There are lots and lots of entries on there about problems and, actually, there are entries all over there about problems with lots of drivers :-( &lt;/p&gt; &lt;p&gt;Specifically, some folks are saying that none of the latest batch of drivers are any good and that you should revert to "old" drivers to get decent performance and stability. Unfortunately, the nVidia archive of Vista drivers doesn't go back to those "old" versions that people are referring to.&lt;/p&gt; &lt;p&gt;The upside of this is that the new card seems to "work ok" with the in-the-box-Vista-driver and I can watch TV and it does seem to actually perform better on the menus and such-like so it's an improvement but I'd like to find an nVidia driver that works with the card so it'll be a trial-and-error job as I go back through all their recent releases trying to find one that works.&lt;/p&gt; &lt;p&gt;The downside is I wonder if my Shuttle is now getting too hot - the fan seems to be whirring up more than it was previously so maybe this whole "new card thing" was a bad idea :-)&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10785" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/25/10785.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10785.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10785</guid>
      <pubDate>Thu, 25 Sep 2008 16:11:14 GMT</pubDate>
    </item>
    <item>
      <title>IE 8 Compatibility - Meta Tags, Http Headers, User Agent Strings etc etc</title>
      <description>&lt;P&gt;I've been wrestling with this for a little while now and wanted to try and get down some thoughts so at least I can refer to them in future. Others will hopefully find them useful as well. I'm not going to pre-amble with all the reasons for why we've had to do this in IE8 - &lt;A href="http://blogs.msdn.com/ie/archive/2008/03/03/microsoft-s-interoperability-principles-and-ie8.aspx"&gt;there are plenty of other places to go for that background&lt;/A&gt;. I'm going to focus on the current state of play in IE8 Beta 2, what happens when you pull certain levers or the user pulls certain levers.&lt;/P&gt;
&lt;P&gt;As I see it, there are a few inputs into this equation:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Page Developer / Site Owner 
&lt;UL&gt;
&lt;LI&gt;Valid DOCTYPE (or not) &lt;/LI&gt;
&lt;LI&gt;Meta tag in header (or not) &lt;/LI&gt;
&lt;LI&gt;HTTP Header (or not) &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;User (ie the person using the browser) 
&lt;UL&gt;
&lt;LI&gt;Compatibility View enabled (or not) &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Let's tackle those one at a time (and because of the dependencies between these things it can be difficult to talk about them in isolation so cut me a bit of slack here):&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;DOCTYPE 
&lt;UL&gt;
&lt;LI&gt;All other things being equal the presence of a valid DOCTYPE switches the browser into "standards" mode. No DOCTYPE typically means &lt;A href="http://en.wikipedia.org/wiki/Quirks_mode"&gt;"quirks" mode&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/cc817574.aspx"&gt;Meta tag in header&lt;/A&gt; 
&lt;UL&gt;
&lt;LI&gt;Format: &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=......."/&amp;gt; &lt;/LI&gt;
&lt;LI&gt;Allows the page developer to specify a particular layout mode (5, 7, EmulateIE7, 8, EmulateIE8, Edge) &lt;/LI&gt;
&lt;LI&gt;Affects a single page and trumps the HTTP header &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-gb/library/cc817572.aspx"&gt;HTTP Header&lt;/A&gt; 
&lt;UL&gt;
&lt;LI&gt;Format: X-UA-Compatible: IE=........ &lt;/LI&gt;
&lt;LI&gt;Allows the site owner to specify a particular layout mode as per the Meta tag &lt;/LI&gt;
&lt;LI&gt;Affects all pages in the site and can be overridden by the Meta tag &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/ie/archive/2008/08/27/introducing-compatibility-view.aspx"&gt;Compatibility View&lt;/A&gt; 
&lt;UL&gt;
&lt;LI&gt;The user has the ability to enable "Compatibility View" for a domain (either by pressing the compatibility view button on a particular page or by enabling it through Compatibility View Settings") &lt;/LI&gt;
&lt;LI&gt;All other things being equal, this will switch the browser from IE8 Standards rendering mode to IE7 Standards rendering mode &lt;/LI&gt;
&lt;LI&gt;By default, all internet sites display in IE8 Standards Mode (Compatibility View off) while all intranet sites display in IE7 Standards Mode (Compatibility View on). This can be changed from the Tools -&amp;gt; Compatibility View Settings menu. &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;And clearly, there are a few outputs as well:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-gb/library/cc817582.aspx"&gt;User agent string&lt;/A&gt; (the browser's identity as sent to the web server) &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-gb/library/cc817574.aspx"&gt;Document mode&lt;/A&gt; (the actual layout mode the browser is using) &lt;/LI&gt;
&lt;LI&gt;The &lt;A href="http://msdn.microsoft.com/en-gb/library/cc817577.aspx"&gt;version vector&lt;/A&gt; (the version number reported by IE, eg for use in conditional comments) &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;For a given set of inputs, IE8 Beta 2 will generate a specific set of outputs. I've collated a table which may help us understand what's going on. The vertical axis represents different Meta tag / HTTP header settings while the horizontal axis represents normal vs compatibility view for both valid and invalid / no DOCTYPEs:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mikeormond/WindowsLiveWriter/IE8CompatibilityMetaTagsHttpHeadersUserA_10A76/image_2.png" rel=lightbox&gt;&lt;IMG border=0 alt=image src="http://blogs.msdn.com/blogfiles/mikeormond/WindowsLiveWriter/IE8CompatibilityMetaTagsHttpHeadersUserA_10A76/image_thumb.png" width=627 height=480&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;What conclusions did I draw from this:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Document / Layout Mode 
&lt;UL&gt;
&lt;LI&gt;No Meta tag / Header 
&lt;UL&gt;
&lt;LI&gt;If there is a valid DOCTYPE you will get the highest level of standards layout mode "available" &lt;/LI&gt;
&lt;LI&gt;ie either 8 in "normal" mode or 7 in "Compatibility View" &lt;/LI&gt;
&lt;LI&gt;Otherwise you get 5 (quirks mode) &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;Meta tag / HTTP header 
&lt;UL&gt;
&lt;LI&gt;Setting to 5/7/8 - that is guaranteed to be the layout mode IE8 will use &lt;/LI&gt;
&lt;LI&gt;Setting to EmulateIEx - you will get layout mode x for a valid DOCTYPE and quirks for invalid / no DOCTYPE &lt;/LI&gt;
&lt;LI&gt;ie the same behaviour as IEx &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;User Agent String 
&lt;UL&gt;
&lt;LI&gt;"Normal" mode - MSIE 8.0 always reported &lt;/LI&gt;
&lt;LI&gt;"Compatibility View" - MSIE 7.0 always reported &lt;/LI&gt;
&lt;LI&gt;Trident/4.0 always reported irrespective of "Compatibility View" setting &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;
&lt;LI&gt;Version Vector 
&lt;UL&gt;
&lt;LI&gt;"Normal" mode - IE8 unless Meta tag / HTTP header overrides with 7 or EmulateIE7 &lt;/LI&gt;
&lt;LI&gt;"Compatibility View" - IE7 unless Meta tag / HTTP header overrides with 8 or EmulateIE8 &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;All the above was derived empirically using the following HTML page deployed to IIS7. I then simply changed the meta tag, HTTP headers or Compatibility View in the browser to create the matrix:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN class=html&gt;DOCTYPE&lt;/SPAN&gt; &lt;SPAN class=attr&gt;html&lt;/SPAN&gt; &lt;SPAN class=attr&gt;PUBLIC&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/SPAN&gt;
   &lt;SPAN class=kwrd&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;html&lt;/SPAN&gt; &lt;SPAN class=attr&gt;xmlns&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="http://www.w3.org/1999/xhtml"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;head&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
  &lt;SPAN class=rem&gt;&amp;lt;!--  &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /&amp;gt;   --&amp;gt;&lt;/SPAN&gt;

  &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;script&lt;/SPAN&gt; &lt;SPAN class=attr&gt;type&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="text/javascript"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;

    &lt;SPAN class=kwrd&gt;function&lt;/SPAN&gt; ShowInfo() {

      &lt;SPAN class=kwrd&gt;var&lt;/SPAN&gt; docMode = document.documentMode;
      &lt;SPAN class=kwrd&gt;var&lt;/SPAN&gt; uaString = navigator.userAgent;

      document.getElementById(&lt;SPAN class=str&gt;"info"&lt;/SPAN&gt;).innerHTML =
        &lt;SPAN class=str&gt;"Document Mode: "&lt;/SPAN&gt; + docMode + &lt;SPAN class=str&gt;"&amp;lt;br /&amp;gt;"&lt;/SPAN&gt; + &lt;SPAN class=str&gt;"UA String: "&lt;/SPAN&gt; + uaString;
    }
    
  &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;script&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;head&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;

&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;body&lt;/SPAN&gt; &lt;SPAN class=attr&gt;onload&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="ShowInfo();"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
  &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt; &lt;SPAN class=attr&gt;id&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;="info"&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
  &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
  &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if IE]&amp;gt;&amp;lt;p&amp;gt;You are using Internet Explorer.&amp;lt;/p&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;&amp;lt;!&lt;/SPAN&gt;[if !IE]&lt;SPAN class=kwrd&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;p&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
      You are not using an uplevel Internet Explorer version.&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;p&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=kwrd&gt;&amp;lt;!&lt;/SPAN&gt;[endif]&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if IE 8]&amp;gt;&amp;lt;p&amp;gt;Welcome to Internet Explorer 8!&amp;lt;/p&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if !(IE 8)]&amp;gt;&amp;lt;p&amp;gt;You are not using Internet Explorer8.&amp;lt;/p&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if gte IE 7]&amp;gt;&amp;lt;p&amp;gt;You are using IE 7 or greater.&amp;lt;/p&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if (IE 5)]&amp;gt;&amp;lt;p&amp;gt;You are using IE 5 (any version).&amp;lt;/p&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if (gte IE 5.5)&amp;amp;(lt IE 7)]&amp;gt;&amp;lt;p&amp;gt;You are using IE 5.5 or IE 6.&amp;lt;/p&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if lt IE 5.5]&amp;gt;&amp;lt;p&amp;gt;Please upgrade your version of Internet Explorer.&amp;lt;/p&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if true]&amp;gt;You are using an &amp;lt;em&amp;gt;uplevel&amp;lt;/em&amp;gt; browser.&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if false]&amp;gt;You are using a &amp;lt;em&amp;gt;downlevel&amp;lt;/em&amp;gt; browser.&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN class=rem&gt;&amp;lt;!--[if true]&amp;gt;&amp;lt;![if IE 7]&amp;gt;&amp;lt;p&amp;gt;This nested comment is displayed in IE 7.&amp;lt;/p&amp;gt;&amp;lt;![endif]&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/SPAN&gt;
  &lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;div&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;body&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=kwrd&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=html&gt;html&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;There's some interesting support for browser and layout modes in the IE8 Developer Tools but I'll write a separate blog post on that. I've probably missed something out, over-simplified something or in some other way mis-represented what happens. In which case, let me know.&lt;/P&gt;
&lt;DIV id=scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1b2d3599-eb8d-41b1-8b29-1f066406fe72 class=wlWriterSmartContent&gt;Technorati Tags: &lt;A href="http://technorati.com/tags/ie8" rel=tag&gt;ie8&lt;/A&gt;,&lt;A href="http://technorati.com/tags/ie" rel=tag&gt;ie&lt;/A&gt;,&lt;A href="http://technorati.com/tags/compatibility" rel=tag&gt;compatibility&lt;/A&gt;,&lt;A href="http://technorati.com/tags/internet%20explorer" rel=tag&gt;internet explorer&lt;/A&gt;,&lt;A href="http://technorati.com/tags/interoperability" rel=tag&gt;interoperability&lt;/A&gt;,&lt;A href="http://technorati.com/tags/layout%20mode" rel=tag&gt;layout mode&lt;/A&gt;,&lt;A href="http://technorati.com/tags/user%20agent%20string" rel=tag&gt;user agent string&lt;/A&gt;,&lt;A href="http://technorati.com/tags/version%20vector" rel=tag&gt;version vector&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8963930" width="1" height="1"&gt;</description>
      <link>http://blogs.msdn.com/mikeormond/archive/2008/09/25/ie-8-compatibility-meta-tags-http-headers-user-agent-strings-etc-etc.aspx</link>
      <source url="http://blogs.msdn.com/mikeormond/default.aspx">Mike Ormond's Blog</source>
      <comments>http://blogs.msdn.com/mikeormond/comments/8963930.aspx</comments>
      <guid isPermaLink="False">91d46819-8472-40ad-a661-2c78acb4018c:8963930</guid>
      <pubDate>Thu, 25 Sep 2008 01:45:00 GMT</pubDate>
    </item>
    <item>
      <title>PDC 2008 - Windows 7 Sessions Published</title>
      <description>&lt;p&gt;Having just built my sketchy list of the sessions I'm interested in at PDC &lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/23/10769.aspx"&gt;here&lt;/a&gt; the game just changed a little in that there are now 17 &lt;a href="https://sessions.microsoftpdc.com/public/sessions.aspx"&gt;sessions&lt;/a&gt; on Windows 7 rather than the 3-5 that there were announced before.&lt;/p&gt; &lt;p&gt;Time for a re-think to my agenda I suspect.&lt;/p&gt; &lt;p&gt;So, is it the Software + Services PDC or the Windows 7 PDC?&lt;/p&gt; &lt;p&gt;I guess the S + S guys would say "Windows 7 is all part of S + S" but then I guess they can legitimately say that about any technology out there :-)&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10783" width="1" height="1"&gt;</description>
      <link>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2008/09/25/10783.aspx</link>
      <source url="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/default.aspx">Mike Taulty's Blog</source>
      <comments>http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/comments/10783.aspx</comments>
      <guid isPermaLink="False">c62f47b3-9054-4265-9c0c-549d811810c2:10783</guid>
      <pubDate>Thu, 25 Sep 2008 00:29:12 GMT</pubDate>
    </item>
    <item>
      <title>WPF 3.5 Sp1 - Now I'm Trying to Write Pixel Shaders :-S</title>
      <description>&lt;p&gt;I've been quite content up until today to say "I can't write Pixel Shaders" and "I don't know what High Level Shader Language" is.&lt;/p&gt; &lt;p&gt;But I thought I'd have a crack at it. Turns out, it just looks like C whereas I expected it to look like assembly.&lt;/p&gt; &lt;p&gt;I read a bit from here;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a title="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/06/17/hlsl-pixel-shader-effects-tutorial.aspx" href="http://blogs.microsoft.co.il/blogs/tamir/archive/2008/06/17/hlsl-pixel-shader-effects-tutorial.aspx"&gt;http://blogs.microsoft.co.il/blogs/tamir/archive/2008/06/17/hlsl-pixel-shader-effects-tutorial.aspx&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;which is a great resource for starting and then I decided to give it a whirl. &lt;/p&gt; &lt;p&gt;Following &lt;a href="http://blogs.msdn.com/nikola/archive/2008/09/04/beginner-s-wpf-pixel-shaders-template-project-samples-light-blobs-twirl-and-other-presentation.aspx"&gt;this post&lt;/a&gt; and downloading the DirectX SDK led me to this masterpiece ;-)&lt;/p&gt;&lt;pre class="csharpcode"&gt;sampler2D input : register(s0);
&lt;span class="kwrd"&gt;float&lt;/span&gt; factor : register(c0);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 Color = tex2D( input , uv.xy);

    Color.rgb = Color.rgb * abs(sin(uv.x * 3.14 * factor)) * abs(sin(uv.y * 3.14 * factor));

    &lt;span class="kwrd"&gt;return&lt;/span&gt;(Color);
}&lt;/pre&gt;
&lt;p&gt;lined up with this piece of C# brilliance :-)&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Media.Effects;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Media;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ShaderEffects
{
  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MikeEffect : ShaderEffect
  {
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; PixelShader _pixelShader = &lt;span class="kwrd"&gt;new&lt;/span&gt; PixelShader()
    {
      UriSource = &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri(&lt;span class="str"&gt;@"pack://application:,,,/ShaderEffects;component/MikeEffect/MikeEffect.ps"&lt;/span&gt;)
    };

    &lt;span class="kwrd"&gt;public&lt;/span&gt; MikeEffect()
    {
      PixelShader = _pixelShader;

      UpdateShaderValue(InputProperty);
      UpdateShaderValue(FactorProperty);
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty InputProperty =
      ShaderEffect.RegisterPixelShaderSamplerProperty(&lt;span class="str"&gt;"Input"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(MikeEffect), 0);

    &lt;span class="kwrd"&gt;public&lt;/span&gt; Brush Input
    {
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; (Brush)GetValue(InputProperty); }
      set { SetValue(InputProperty, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; DependencyProperty FactorProperty =
      DependencyProperty.Register(&lt;span class="str"&gt;"Factor"&lt;/span&gt;,
        &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;double&lt;/span&gt;), &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(MikeEffect), &lt;span class="kwrd"&gt;new&lt;/span&gt; UIPropertyMetadata(0.0, PixelShaderConstantCallback(0)));

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; Factor
    {
      get { &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;double&lt;/span&gt;)GetValue(FactorProperty); }
      set { SetValue(FactorProperty, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
    }
  }
}&lt;/pre&gt;
&lt;p&gt;Naturally, I'm joking about the "brilliance" of it - I still don't have a clue what I'm doing but I was very impressed with how easy it was and how &lt;strong&gt;&lt;em&gt;fast&lt;/em&gt;&lt;/strong&gt; it ran when I used it and bound the &lt;strong&gt;Factor&lt;/strong&gt; property to a slider as in;&lt;/p&gt;&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Border&lt;/span&gt;
      &lt;span class="attr"&gt;Grid&lt;/span&gt;.&lt;span class="attr"&gt;ColumnSpan&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Border.Effect&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;local:MikeEffect&lt;/span&gt;
          &lt;span class="attr"&gt;Factor&lt;/span&gt;&lt;span class="kwrd"&gt;="{Binding ElementName=mikeSlider,Path=Value}"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Border.Effect&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;    
&lt;/pre&gt;
&lt;p&gt;and then;&lt;/p&gt;&lt;pre class="csharpcode"&gt;  &amp;lt;Slider
        Minimum=&lt;span class="str"&gt;"0"&lt;/span&gt;
        Maximum=&lt;span class="str"&gt;"20"&lt;/span&gt;
        Value=&lt;span class="str"&gt;"1"&lt;/span&gt;
        x:Name=&lt;span class="str"&gt;"mikeSlider"&lt;/span&gt;
        Width=&lt;span class="str"&gt;"192"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;p&gt;I believe you can also do this with multi-input effects to transition from one piece of content to another - sounds pretty slick.&lt;/p&gt;&lt;img src="http://mtaulty.com/CommunityServer/aggbug.aspx?PostID=10782