<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.infragistics.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Josh Smith</title><link>http://blogs.infragistics.com/blogs/joshs/default.aspx</link><description>Follow me down the rabbit hole of cutting edge technology.</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Article about xamSalesManager</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/07/25/article-about-xamsalesmanager.aspx</link><pubDate>Fri, 25 Jul 2008 12:35:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:16043</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/16043.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=16043</wfw:commentRss><description>&lt;p&gt;In the recently released NetAdvantage for WPF v8.1, the xamShowcase application contains a new sample called xamSalesManager.&amp;nbsp; I was the Developer on that project, and worked closely with some talented Visual Designers from the Experience Design Group.&amp;nbsp; The application uses several of our WPF components to create a stellar Executive Dashboard interface for a Regional Sales Manager.&amp;nbsp; The application was structured by applying the Model-View-ViewModel pattern.&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/xamSalesManager_screenshot.jpg"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;You can check out xamSalesManager, and all of the other showcase samples, either by installing the product or by running it in your browser.&amp;nbsp; The XBAP version of xamShowcase is located here:&lt;/p&gt;&lt;p&gt;&lt;a href="http://xamples.infragistics.com/" target="_blank"&gt;http://xamples.infragistics.com/&lt;/a&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;I wrote a whitepaper about the application, which was subsequently edited and posted on CodeProject.&amp;nbsp; If you would like to learn more about how xamSalesManager was designed and implemented, I suggest you check out this article:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codeproject.com/KB/showcase/InsideXamSalesManager.aspx" target="_blank"&gt;http://www.codeproject.com/KB/showcase/InsideXamSalesManager.aspx&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Enjoy! &lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=16043" width="1" height="1"&gt;</description></item><item><title>Synchronizing Field Widths between FieldLayouts in XamDataGrid</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/07/02/synchronizing-field-widths-between-fieldlayouts-in-xamdatagrid.aspx</link><pubDate>Wed, 02 Jul 2008 20:55:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:15694</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/15694.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=15694</wfw:commentRss><description>&lt;p&gt;This blog post shows how to force the width of Fields in a
child FieldLayout to have the same width as the Fields in the parent/master
FieldLayout.&amp;nbsp; This is a stopgap solution,
useful only until XamDataGrid has native support for this feature.&amp;nbsp; The desired result is that the XamDataGrid's
top-level records have resizable cells, and the non-resizable cells in child records
keep their widths the same as the corresponding cells in their parent record.&amp;nbsp; Also, we will align the text in the child records
with the text in the parent record, so that the XamDataGrid ends up looking
like this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/xamDataGrid_syncFieldWidths.png"&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;In the screenshot above, the XamDataGrid has two master
records, each of which represent a country.&amp;nbsp;
The master records have child records, which represent states or cities
within that country.&amp;nbsp; Every location in
the grid has a name and a description, so it makes sense to keep all of the fields
the same width and have their values line up.&amp;nbsp;
This technique uses the hierarchical display support of XamDataGrid to
provide a clean, simple listing of hierarchical data.&amp;nbsp; In addition, if you were to adjust the width
of the Field headers or cells in a master record, the corresponding cells in
the detail records would resize to the same width.&lt;/p&gt;

&lt;p&gt;First, let's examine the XAML in the demo application's main
Window that configures the XamDataGrid.&amp;nbsp;
The most important parts are &lt;b&gt;bold&lt;/b&gt;:&lt;/p&gt;&amp;lt;igDP:XamDataGrid &lt;br&gt;&amp;nbsp; x:Name="xamDataGrid"&lt;br&gt;&amp;nbsp; DataSource="{Binding}"&lt;br&gt;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;FieldLayoutInitialized="xamDataGrid_FieldLayoutInitialized"&lt;/span&gt;&lt;br&gt;&amp;nbsp; GroupByAreaLocation="None"&lt;br&gt;&amp;nbsp; &amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;igDP:XamDataGrid.Resources&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;&amp;lt;!-- &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; This Style enables us to monitor changes to field widths.&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style TargetType="{x:Type igDP:LabelPresenter}"&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;EventSetter&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Event="SizeChanged" &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Handler="OnLabelPresenterSizeChanged" &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &amp;lt;/igDP:XamDataGrid.Resources&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;igDP:XamDataGrid.DataContext&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ObjectDataProvider &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MethodName="GetData" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectType="{x:Type local:DataSource}" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/igDP:XamDataGrid.DataContext&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;igDP:XamDataGrid.FieldLayouts&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout Key="master"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout.Fields&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="ID" Visibility="Collapsed" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="Name" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="Description"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings LabelWidth="260" CellWidth="260" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout.Fields&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout.FieldSettings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings.CellValuePresenterStyle&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style TargetType="{x:Type igDP:CellValuePresenter}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="FontWeight" Value="Bold" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldSettings.CellValuePresenterStyle&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldSettings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout.FieldSettings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout Key="detail"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout.Fields&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="ParentID" Visibility="Collapsed" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="Name" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="Description" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout.Fields&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout.FieldSettings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings AllowResize="False" LabelMaxHeight="0"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;&amp;lt;igDP:FieldSettings.CellValuePresenterStyle&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This Style aligns the child record cell text with the parent cells&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; regardless of whether the record is selected, mouseover, etc.&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style TargetType="{x:Type igDP:CellValuePresenter}"&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Margin" Value="-3,0,0,0" /&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style.Triggers&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataTrigger &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Binding="{Binding &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RelativeSource={RelativeSource AncestorType={x:Type igDP:DataRecordPresenter}}, &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Path=IsMouseOver}" &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value="True"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Margin" Value="-3,0,0,0" /&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DataTrigger&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataTrigger &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Binding="{Binding &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RelativeSource={RelativeSource AncestorType={x:Type igDP:DataRecordPresenter}}, &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Path=IsSelected}" &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value="True"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Margin" Value="-3,0,0,0" /&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DataTrigger&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style.Triggers&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldSettings.CellValuePresenterStyle&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldSettings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout.FieldSettings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayoutSettings HighlightAlternateRecords="True" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/igDP:XamDataGrid.FieldLayouts&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;igDP:XamDataGrid.FieldSettings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings AllowEdit="False" CellClickAction="SelectRecord" /&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/igDP:XamDataGrid.FieldSettings&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/igDP:XamDataGrid&amp;gt;&lt;br&gt;&lt;p&gt;All of the magic here is done via Styles.&amp;nbsp; The control's Resources collection has a
typed Style that targets LabelPresenter.&amp;nbsp;
That Style adds a handler to a LabelPresenter's SizeChanged event.&amp;nbsp; This is how we can detect changes to the
width of Fields at runtime.&amp;nbsp; The other
Style is applied to the child FieldLayout's CellValuePresenterStyle.&amp;nbsp; It ensures that the text in the child record cells
is pushed a little to the left, thus ensuring that it lines up with the text in
the parent row.&lt;/p&gt;

&lt;p&gt;The code-behind is not too complicated.&amp;nbsp; It just handles the SizeChanged event of
every LabelPresenter to verify that the child Fields are the same width as the
parent Fields.&amp;nbsp; It also handles the
FieldLayoutInitialized event of the XamDataGrid so that it can bind the child
Field widths to the parent Field widths.&amp;nbsp;
The demo Window's code is below:&lt;/p&gt;public partial class Window1 : Window&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FieldLayout _masterFieldLayout;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Window1()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Invoked when a field in the datagrid is resized.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void OnLabelPresenterSizeChanged(object sender, SizeChangedEventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var pres = sender as LabelPresenter;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pres == null || pres.Field.Owner != _masterFieldLayout)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ignore tiny changes because they can lead to infinite layout loops.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; double diff = Math.Abs(pres.Field.Settings.LabelWidth - pres.ActualWidth);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (diff &amp;lt;= 1)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set the LabelWidth property so that the LabelWidthResolved is recalculated.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // That forces the binding to update the width of the corresponding field in &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the detail layout.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pres.Field.Settings.LabelWidth = pres.ActualWidth;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void xamDataGrid_FieldLayoutInitialized(object sender, FieldLayoutInitializedEventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_masterFieldLayout == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _masterFieldLayout = e.FieldLayout;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get all of the visible fields in the master layout.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Field&amp;gt; masterFields =&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (from f in _masterFieldLayout.Fields&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where f.VisibilityResolved == Visibility.Visible&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select f)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get all of the visible fields in the detail layout.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Field&amp;gt; detailFields =&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (from f in e.FieldLayout.Fields&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where f.VisibilityResolved == Visibility.Visible&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select f)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToList();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int iterations = Math.Min(masterFields.Count, detailFields.Count);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Bind the width of each field in the detail layout to&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the resolved/actual width of the corresponding field &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // in the master layout.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int n = 0; n &amp;lt; iterations; ++n)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingOperations.SetBinding(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; detailFields[ n ].Settings,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FieldSettings.LabelWidthProperty,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Binding&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Path = new PropertyPath("LabelWidthResolved"),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source = masterFields[ n ]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&lt;p&gt;Download the source code &lt;a href="http://users.infragistics.com/joshs/XamDataGridWithSynchronizedFieldWidths.zip"&gt;here&lt;/a&gt;.&amp;nbsp; The solution was built and tested in Visual
Studio 2008, using NetAdvantage for WPF v8.1.&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=15694" width="1" height="1"&gt;</description></item><item><title>Data Binding the IsVisible Property of ContextualTabGroup</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/06/26/data-binding-the-isvisible-property-of-contextualtabgroup.aspx</link><pubDate>Thu, 26 Jun 2008 20:47:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:15618</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/15618.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=15618</wfw:commentRss><description>&lt;p&gt;XamRibbon allows you to have groups of tabs that only display when the application is in a certain state or condition.&amp;nbsp; In other words, it offers context-sensitive tab groups.&amp;nbsp; You can use them by adding ContextualTabGroup objects to the ContextualTabGroups property of XamRibbon.&amp;nbsp; If you want to hide a ContextualTabGroup, you simply set its IsVisible property to false.&lt;/p&gt;&lt;p&gt;What if you want to data bind IsVisible to a property on a ViewModel object?&amp;nbsp; Then the situation becomes a little bit more difficult, because ContextualTabGroup is not a visual element and does not exist in the element tree.&amp;nbsp; A brief glance in &lt;a href="http://moleproject.com" target="_blank"&gt;Mole&lt;/a&gt; can prove that this is the case:&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/contextualTabGroup_mole.png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Notice how the Visual Tree, on the left, does not contain a ContextualTabGroup instance, but the Visual Tree elements have their DataContext set to an instance of ContextualTabGroup.&amp;nbsp; It turns out that ContextualTabGroup is more like a container for settings, not a full-fledged UI element.&amp;nbsp; One important ramification of this seemingly minor detail is that ContextualTabGroup objects are not in the logical tree, which means they do not have an inheritance context, which means that their properties cannot be data bound like properties of a normal UI element in the element tree.&lt;/p&gt;&lt;p&gt;I recently wrote of a way to work around the fact that some objects declared in XAML do not have an inheritance context, in my “&lt;a href="http://blogs.infragistics.com/blogs/joshs/archive/2008/06/05/binding-a-xamdatagrid-field-property.aspx"&gt;Binding a XamDataGrid Field Property&lt;/a&gt;” post.&amp;nbsp; In this post, I will show another, far more elegant, way to deal with this problem.&amp;nbsp; I am basing my work here on the “&lt;a href="http://blogs.msdn.com/mikehillberg/archive/2008/05/21/Model-see_2C00_-model-do.aspx"&gt;Model-see, Model-do, and the Poo is Optional&lt;/a&gt;” post by Mike Hillberg, of Microsoft.&lt;/p&gt;&lt;p&gt;My objective is simple.&amp;nbsp; I want to have a CheckBox bound to a property on a simple ViewModel class, and the IsVisible property of a ContextualTabGroup bound to that same property.&amp;nbsp; When the CheckBox is checked, the tab group displays.&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/demoApp_screenshot.png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;When the CheckBox is unchecked, the tab group goes away.&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/demoAppHiddenGroup_screenshot.png"&gt;&lt;/p&gt;&lt;p&gt;The ViewModel class, an instance of which serves as the Window’s DataContext, looks like this:&lt;/p&gt;&lt;p&gt;class MyViewModel: INotifyPropertyChanged&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool _showContextualTabGroup;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool ShowContextualTabGroup&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _showContextualTabGroup; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value == _showContextualTabGroup)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _showContextualTabGroup = value;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.OnPropertyChanged("ShowContextualTabGroup");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region INotifyPropertyChanged Members&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public event PropertyChangedEventHandler PropertyChanged;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void OnPropertyChanged(string propertyName)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (this.PropertyChanged != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;}&lt;/p&gt;&lt;p&gt;The trick to making this work is in my DataContextSpy class.&amp;nbsp; It provides an artificial inheritance context with which the ContextualTabGroup can gain access to the Window’s ViewModel via one simple data binding expression.&amp;nbsp;&amp;nbsp; Naturally, you can use DataContextSpy for much more than just this one particular task.&amp;nbsp; Here is the class definition:&lt;/p&gt;&lt;p&gt;public class DataContextSpy&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Freezable // Enable ElementName and DataContext bindings&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataContextSpy()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This binding allows the spy to inherit a DataContext.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindingOperations.SetBinding(this, DataContextProperty, new Binding());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object DataContext&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return (object)GetValue(DataContextProperty); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { SetValue(DataContextProperty, value); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Borrow the DataContext dependency property from FrameworkElement.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly DependencyProperty DataContextProperty =&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FrameworkElement.DataContextProperty.AddOwner(typeof(DataContextSpy));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override Freezable CreateInstanceCore()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // We are required to override this abstract method.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotImplementedException();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/p&gt;&lt;p&gt;Now here is the XAML content of the Window, which contains the XamRibbon and DataContextSpy:&lt;/p&gt;&lt;p&gt;&amp;lt;DockPanel&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;CheckBox &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DockPanel.Dock="Bottom"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Content="Show ContextualTabGroup" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;IsChecked="{Binding Path=ShowContextualTabGroup}"&lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Margin="10"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;igRibbon:XamRibbon DockPanel.Dock="Top"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igRibbon:XamRibbon.Resources&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&amp;lt;local:DataContextSpy x:Key="spy" /&amp;gt;&lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igRibbon:XamRibbon.Resources&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igRibbon:XamRibbon.ContextualTabGroups&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igRibbon:ContextualTabGroup &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Caption="I am a ContextualTabGroup" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;IsVisible="{Binding &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source={StaticResource spy}, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Path=DataContext.ShowContextualTabGroup}"&lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igRibbon:RibbonTabItem &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Header="I am a RibbonTabItem in the ContextualTabGroup" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igRibbon:ContextualTabGroup&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igRibbon:XamRibbon.ContextualTabGroups&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/igRibbon:XamRibbon&amp;gt;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp; &lt;br&gt;&amp;lt;/DockPanel&amp;gt;&lt;/p&gt;&lt;p&gt;You can download the source code &lt;a href="http://users.infragistics.com/joshs/DataContextSpyDemo.zip"&gt;here&lt;/a&gt;. Note: this project requires &lt;b&gt;Visual Studio 2008&lt;/b&gt; and &lt;b&gt;NetAdvantage for WPF v7.2&lt;/b&gt; or later to compile.&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=15618" width="1" height="1"&gt;</description></item><item><title>Persisting XamDataGrid Field Widths between Runs of an Application</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/06/20/persisting-xamdatagrid-field-widths-between-runs-of-an-application.aspx</link><pubDate>Fri, 20 Jun 2008 13:47:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:15530</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/15530.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=15530</wfw:commentRss><description>XamDataGrid has many great features, but as of NetAdvantage
for WPF v7.2, it does not yet provide a generic way to save and load user settings.&amp;nbsp; A common requirement for a grid-centric application
is that the columns/fields in the grid retain their widths from one run of the application
to the next.&amp;nbsp; I have created a stopgap
solution, in the form of a utility class, that we can use until XamDataGrid has
native support for this functionality.

&lt;p&gt;I created a class called XamDataGridFieldWidthManager that
you can use to handle the saving, loading, and applying of field widths.&amp;nbsp; It will take a XamDataGrid like this...&lt;/p&gt;
&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/persistedFieldWidths_screenshot.png"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;...and, upon calling its SaveFieldWidths method, it will generate
the following XML...&lt;/p&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;&amp;lt;field-layouts&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;field-layout id="master"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name="ID" width="52" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name="Column 1" width="77" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name="Column 2" width="71" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name="Column 3" width="148" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name="Column 4" width="168" /&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/field-layout&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;field-layout id="detail"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name="ParentID" width="258" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name="Whatever" width="190" /&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/field-layout&amp;gt;&lt;br&gt;&amp;lt;/field-layouts&amp;gt;&lt;br&gt;
&lt;p&gt;You can save that XML somewhere, and next time that you
display that XamDataGrid in your program, you pass the XML back to XamDataGridFieldWidthManager
so that those persisted field widths are applied to the new fields. &lt;/p&gt;

&lt;p&gt;Here is how the demo program uses XamDataGridFieldWidthManager:&lt;/p&gt;
public partial class Window1 : Window&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const string SETTINGS_FILE = "field-widths.xml";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; readonly XamDataGridFieldWidthManager _widthManager;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Window1()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.InitializeComponent();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _widthManager = this.CreateWidthManager();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NOTE: You *must* attach a handler to the RequestFieldLayoutID event.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _widthManager.RequestFieldLayoutID += this.OnWidthManagerRequestFieldLayoutID;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XamDataGridFieldWidthManager CreateWidthManager()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StreamReader streamReader = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlReader xmlReader = null;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (File.Exists(SETTINGS_FILE))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; streamReader = new StreamReader(SETTINGS_FILE);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlReader = XmlReader.Create(streamReader);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new XamDataGridFieldWidthManager(this.xamDataGrid, xmlReader);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finally&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (streamReader != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; streamReader.Dispose();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void OnWidthManagerRequestFieldLayoutID(object sender, RequestFieldLayoutIDEventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Provide a unique identifier for each of the FieldLayouts in the XamDataGrid.&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (e.FieldLayout.Key == this.xamDataGrid.DataSource)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.UniqueID = "master";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.UniqueID = "detail";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnClosing(CancelEventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnClosing(e);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!e.Cancel)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Save the field widths to disk.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var settings = new XmlWriterSettings { Indent = true };&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (var xmlWriter = XmlWriter.Create(SETTINGS_FILE, settings))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _widthManager.SaveFieldWidths(xmlWriter);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;
&lt;p&gt;It is important to note that you must hook the
RequestFieldLayoutID event and, in that event handling method, supply a unique
identifier for each FieldLayout in the XamDataGrid.&amp;nbsp; This is necessary because XamDataGridFieldWidthManager
must be able to map a &amp;lt;field-layout&amp;gt; XML element to a FieldLayout object,
but it has no way to produce the same unique identifier for the same &lt;i&gt;logical&lt;/i&gt; FieldLayout &amp;nbsp;across runs of the application.&amp;nbsp; Since I have no way to do that in a generic
fashion, I consult the class's consumer for that information.&lt;/p&gt;

Download the source code
and demo project &lt;a href="http://users.infragistics.com/joshs/XamDataGridPersistedFieldWidths.zip"&gt;here&lt;/a&gt;.&amp;nbsp; You must have Visual Studio 2008 and
NetAdvantage for WPF v7.2 or later installed.
&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=15530" width="1" height="1"&gt;</description></item><item><title>Putting a CheckBox in the cells of an UnboundField of XamDataGrid</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/06/16/putting-a-checkbox-in-the-cells-of-an-unboundfield-of-xamdatagrid.aspx</link><pubDate>Mon, 16 Jun 2008 22:36:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:15472</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/15472.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=15472</wfw:commentRss><description>&lt;p&gt;This blog post demonstrates the correct way to put a CheckBox into the cell of an unbound field for each row in a XamDataGrid.&amp;nbsp; The demo application allows the user to dynamically add and remove customers from a 3D Pie Chart, to compare their total sales against each other.&amp;nbsp; The image below is a screenshot of this demo:&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/XamDataGridWithCheckBoxInUnboundField.png"&gt;&lt;/p&gt;&lt;p&gt;The “Compare” field on the left-hand side is an “unbound field.”&amp;nbsp; This means that it does not have a corresponding property on the data source object to which it is bound.&amp;nbsp; You can add as many UnboundField objects into a FieldLayout as you like.&lt;/p&gt;&lt;p&gt;This demo application’s data source is an array of my Customer class, as seen below:&lt;/p&gt;&lt;p&gt;public class Customer&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Customer(int id, string name, double totalSales)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ID = id;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Name = name;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.TotalSales = totalSales;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ID { get; private set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get; private set; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public double TotalSales { get; private set; }&lt;br&gt;}&lt;/p&gt;&lt;p&gt;The window contains a XamDataGrid and XamChart.&amp;nbsp; When the user checks a CheckBox in a row of the grid, we add the corresponding Customer’s data to the chart.&amp;nbsp; Here is the XAML declaration of the XamDataGrid:&lt;/p&gt;&lt;p&gt;&amp;lt;igDP:XamDataGrid &lt;br&gt;&amp;nbsp; Grid.Row="0" &lt;br&gt;&amp;nbsp; AutoFit="True"&lt;br&gt;&amp;nbsp; DataSource="{Binding}" &lt;br&gt;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;InitializeRecord="XamDataGrid_InitializeRecord"&lt;/span&gt;&lt;br&gt;&amp;nbsp; Theme="Office2k7Black"&lt;br&gt;&amp;nbsp; &amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;igDP:XamDataGrid.CommandBindings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Listen for our custom ShowInChart command.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CommandBinding &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Command="local:Commands.ShowInChart"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CanExecute="ShowInChart_CanExecute"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Executed="ShowInChart_Executed"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &amp;lt;/igDP:XamDataGrid.CommandBindings&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;igDP:XamDataGrid.Resources&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Displays a CheckBox in the ShowInChart field. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;x:Key="ShowInChartCellStyle"&lt;/span&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TargetType="{x:Type igDP:CellValuePresenter}"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Template"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter.Value&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ControlTemplate TargetType="{x:Type igDP:CellValuePresenter}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight:bold;"&gt; &amp;lt;CheckBox &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Command="local:Commands.ShowInChart"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CommandParameter="{Binding Path=DataItem}"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HorizontalAlignment="Center" &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IsChecked="{Binding &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RelativeSource={RelativeSource TemplatedParent}, &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Path=Value, &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mode=TwoWay}"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VerticalAlignment="Center"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ControlTemplate&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Setter.Value&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Setter&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Applies currency formatting to cells in the TotalSales field. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:Key="TotalSalesEditorStyle" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TargetType="{x:Type igEditors:ValueEditor}"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Format" Value="c" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/igDP:XamDataGrid.Resources&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;igDP:XamDataGrid.FieldLayouts&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout.Fields&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;&amp;lt;igDP:UnboundField Name="ShowInChart" Label="Compare"&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:UnboundField.Settings&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CellMaxWidth="70" LabelMaxWidth="70" &lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CellValuePresenterStyle="{StaticResource ShowInChartCellStyle}"&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:UnboundField.Settings&amp;gt;&lt;/span&gt;&lt;br style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:UnboundField&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="ID"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CellMaxWidth="40" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LabelMaxWidth="40" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="Name" Label="Customer Name" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name="TotalSales" Label="Total Sales"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EditorStyle="{StaticResource TotalSalesEditorStyle}" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout.Fields&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/igDP:XamDataGrid.FieldLayouts&amp;gt;&lt;br&gt;&amp;lt;/igDP:XamDataGrid&amp;gt;&lt;/p&gt;&lt;p&gt;In the grid’s FieldLayouts section, there is one FieldLayout being created.&amp;nbsp; It’s first field is our UnboundField, named “ShowInChart.”&amp;nbsp; Notice that its CellValuePresenterStyle property is set to reference the “ShowInChartCellStyle” Style, which is declared above.&amp;nbsp; That Style applies a ControlTemplate to the CellValuePresenter in each cell of that field.&amp;nbsp; The ControlTemplate specifies that a CheckBox control should be displayed in the cell.&amp;nbsp; Looking closely at the CheckBox declaration, you can see that it’s IsChecked property is bound to its TemplatedParent, which in this case is the CellValuePresenter being templated.&amp;nbsp; We need to establish this two-way binding against the CellvaluePresenter’s Value property so that the CheckBox and cell value are kept in sync with each other.&amp;nbsp; If we did not do this, the grid would be in an inconsistent state.&lt;/p&gt;&lt;p&gt;When the Window loads up and the XamDataGrid is populated with data, the grid’s InitializeRecord event is handled for each row.&amp;nbsp; That code initializes the unbound field’s cell value to false, as seen below:&lt;/p&gt;&lt;p&gt;void XamDataGrid_InitializeRecord(object sender, InitializeRecordEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize each ShowInChart cell to false.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataRecord dataRecord = e.Record as DataRecord;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (dataRecord != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataRecord.Cells["ShowInChart"].Value = false;&lt;br&gt;}&lt;/p&gt;&lt;p&gt;So far so good, but what happens when the user checks or unchecks one of those CheckBoxs?&amp;nbsp; How does the program know which Customer’s CheckBox was affected, and when it is changed?&amp;nbsp; This problem can be solved in several ways, but I prefer to use routed commands for this type of task.&amp;nbsp; In the demo app, the Commands.cs file contains this class:&lt;/p&gt;&lt;p&gt;public static class Commands&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly RoutedCommand ShowInChart = new RoutedCommand();&lt;br&gt;}&lt;/p&gt;&lt;p&gt;As seen in the XAML declaration previously, the XamDataGrid is given a CommandBinding for the ShowInChart command.&amp;nbsp; The command’s events are handled in the window’s code-behind, as seen below:&lt;/p&gt;&lt;p&gt;void ShowInChart_CanExecute(object sender, CanExecuteRoutedEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The ShowInChart command can execute if &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the parameter references a Customer.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.CanExecute = e.Parameter is Customer;&lt;br&gt;}&lt;br&gt;&lt;br&gt;void ShowInChart_Executed(object sender, ExecutedRoutedEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Customer cust = e.Parameter as Customer;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (cust != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.AddOrRemoveCustomer(cust);&lt;br&gt;}&lt;br&gt;&lt;br&gt;void AddOrRemoveCustomer(Customer cust)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataPointCollection dataPoints = this.chart.Series[0].DataPoints;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string label = "Cust #" + cust.ID;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Check if the customer is in the chart already.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var dataPoint = dataPoints.FirstOrDefault(dp =&amp;gt; dp.Label == label);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (dataPoint == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add the customer to the pie chart.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string tooltip =&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String.Format(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Name: {0} {1} Total Sales: {2}",&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cust.Name,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Environment.NewLine,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cust.TotalSales.ToString("c"));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataPoint = new DataPoint&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Label = label,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value = cust.TotalSales,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ToolTip = tooltip&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataPoints.Add(dataPoint);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Remove the customer from the pie chart.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataPoints.Remove(dataPoint);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&lt;br&gt;You can download the demo source code &lt;a href="http://users.infragistics.com/joshs/XamDataGridWithCheckBoxInUnboundField.zip"&gt;here&lt;/a&gt;.&amp;nbsp; You must have &lt;span style="font-weight:bold;"&gt;Visual Studio 2008&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;NetAdvantage for WPF v7.2&lt;/span&gt; (or later) installed to compile and run this project.&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=15472" width="1" height="1"&gt;</description></item><item><title>Binding a XamDataGrid Field Property</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/06/05/binding-a-xamdatagrid-field-property.aspx</link><pubDate>Fri, 06 Jun 2008 01:53:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:15342</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/15342.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=15342</wfw:commentRss><description>&lt;p&gt;I recently needed to bind the Visibility of a Field in a XamDataGrid to a property on my ViewModel.&amp;nbsp; I wanted to provide a way for the user to show/hide a column of images in the data grid.&amp;nbsp; My ViewModel object is a POCO (Plain Old Clr Object) that implements INotifyPropertyChanged, and represents the data and UI state of my Window.&amp;nbsp; Unfortunately a Field object is not in the element tree and does not derive from Freezable, which means it does not have an inheritance context, thus its properties cannot participate in normal WPF data binding.&amp;nbsp; &lt;/p&gt;&lt;p&gt;If/when WPF eventually provides a way to give any object an inheritance context, this won't be an issue, but for now there is no clean way to bind a Field's properties to objects inherited down the logical tree, or to the properties of other elements.&amp;nbsp; This blog post shows a workaround that I came up with, allowing me to easily bind the Visibility of a Field to any object.&lt;/p&gt;&lt;p&gt;Here is the basic idea of what I'm trying to accomplish.&amp;nbsp; First the grid displays a column of images:&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/AppWithPhotos.png"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you then click the "Show Photos" CheckBox in the ToolBar, the column of photos is hidden, as seen below:&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/AppWithoutPhotos.png"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Here is the code-behind of the Window:&lt;/p&gt;&lt;p&gt;public partial class Window1 : Window&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Window1()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Person[] people = new Person[]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Person("Boss Hogg", 42, "hogg.jpg"),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Person("Johann Bach", 50, "bach.jpg"),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Person("Mugatu", 39, "mugatu.gif"),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Person("Simon Wolcott", 24, "wolcott.jpg")&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.DataContext = new CommunityViewModel(people);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Application.Current.Resources.Add("DATA_CommunityViewModel", base.DataContext);&lt;/b&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/p&gt;&lt;p&gt;Notice that I'm adding the CommunityViewModel class to both the DataContext of the Window and the Resources of the App.&amp;nbsp; I set the DataContext to the ViewModel so that the XamDataGrid and CheckBox controls can bind to its properties.&amp;nbsp; I add it to the App's Resources so that the Field's Visibility binding can access it.&amp;nbsp; Here is the CommunityViewModel class:&lt;/p&gt;&lt;p&gt;class CommunityViewModel : INotifyPropertyChanged&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool _showPhotos;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CommunityViewModel(IList&amp;lt;Person&amp;gt; constituents)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Constituents = new ReadOnlyCollection&amp;lt;Person&amp;gt;(constituents);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _showPhotos = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ReadOnlyCollection&amp;lt;Person&amp;gt; Constituents { get; set; }&lt;br&gt;&lt;b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool ShowPhotos&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _showPhotos; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value == _showPhotos)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _showPhotos = value;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.OnPropertyChanged("ShowPhotos");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/b&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region INotifyPropertyChanged Members&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public event PropertyChangedEventHandler PropertyChanged;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void OnPropertyChanged(string propertyName)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (this.PropertyChanged != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;}&lt;/p&gt;&lt;p&gt;The magic happens in the XAML.&amp;nbsp; Pay close attention to the 'Photo' Field declaration:&lt;/p&gt;&lt;p&gt;&amp;lt;Window &lt;br&gt;&amp;nbsp; x:Class="XamDataGridWithBoundField.Window1"&lt;br&gt;&amp;nbsp; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br&gt;&amp;nbsp; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br&gt;&amp;nbsp; xmlns:igDP="http://infragistics.com/DataPresenter"&lt;br&gt;&amp;nbsp; Title="Window1" &lt;br&gt;&amp;nbsp; Width="400" Height="400" &lt;br&gt;&amp;nbsp; &amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;Window.Resources&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:Key="PhotoCellStyle" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TargetType="{x:Type igDP:CellValuePresenter}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Template"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter.Value&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ControlTemplate TargetType="{x:Type igDP:CellValuePresenter}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Image&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source="{Binding &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RelativeSource={RelativeSource TemplatedParent}, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Path=Content}" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Width="60" Height="60"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ControlTemplate&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Setter.Value&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Setter&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/Window.Resources&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;DockPanel&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ToolBar DockPanel.Dock="Top"&amp;gt;&lt;br&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CheckBox &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Content="Show Photos" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IsChecked="{Binding Path=ShowPhotos}" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ToolBar&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:XamDataGrid &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AutoFit="True" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataSource="{Binding Constituents}"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:XamDataGrid.FieldLayouts&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldLayout.Fields&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Label="Name" Name="Name" /&amp;gt;&lt;br&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Label="Photo" Name="ImageUri"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CellMaxWidth="70" LabelMaxWidth="70"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CellValuePresenterStyle="{StaticResource PhotoCellStyle}"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field.Settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field.Visibility&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Binding &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Path="ShowPhotos"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source="{StaticResource DATA_CommunityViewModel}"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Binding.Converter&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;BooleanToVisibilityConverter /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Binding.Converter&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Binding&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field.Visibility&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:Field&amp;gt;&lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Label="Age" Name="Age" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout.Fields&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldLayout&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:XamDataGrid.FieldLayouts&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:XamDataGrid&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/DockPanel&amp;gt;&lt;br&gt;&amp;lt;/Window&amp;gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;You can download the demo source code &lt;a href="http://users.infragistics.com/joshs/XamDataGridWithBoundField.zip"&gt;here&lt;/a&gt;.&amp;nbsp; You will need to have the Infragistics NetAdvantage for WPF installed to run the application.&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=15342" width="1" height="1"&gt;</description></item><item><title>Using a ViewModel to harness the power of the WPF TreeView</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/05/23/using-a-viewmodel-to-harness-the-power-of-the-wpf-treeview.aspx</link><pubDate>Fri, 23 May 2008 13:33:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:15132</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/15132.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=15132</wfw:commentRss><description>&lt;p&gt;Microsoft's WPF TreeView control can be very difficult to work with, if you try to use it the same way that you program against a Windows Forms TreeView.&amp;nbsp; WPF's TreeView is much more feature-rich and powerful, such as having support for data binding and full visual customizations.&amp;nbsp; Those powers make the control more complicated than the WinForms equivalent.&amp;nbsp; It can be difficult to use, but it does not have to be!&lt;/p&gt;&lt;p&gt;The key to using the WPF TreeView control properly is to provide it with a ViewModel, essentially an abstraction of the tree's state.&amp;nbsp; The TreeView binds to its ViewModel, allowing your code to ignore the TreeView altogether.&amp;nbsp; Once you start programming against your ViewModel abstraction, it is very easy to leverage the power of the TreeView.&amp;nbsp; I published an article about this topic on CodeProject.&amp;nbsp; If you are interested in learning more about it, here's the link: &lt;a href="http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx" target="_blank"&gt;http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=15132" width="1" height="1"&gt;</description></item><item><title>XamDataGrid validation via IDataErrorInfo</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/05/15/xamdatagrid-validation-via-idataerrorinfo.aspx</link><pubDate>Thu, 15 May 2008 14:25:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:15076</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/15076.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=15076</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://karlshifflett.wordpress.com/" target="_blank"&gt;Karl Shifflett&lt;/a&gt; implemented a great way to have XamDataGrid honor the validation results exposed by a data object that implements the IDataErrorInfo interface.&amp;nbsp; Using this approach to input validation allows your application to keep the business object validation logic where it belongs...in the business objects.&amp;nbsp; I recommend you use Karl's approach until native support for IDataErrorInfo is added to XamDataGrid.&lt;/p&gt;&lt;p&gt;Karl's article can be found &lt;a href="http://karlshifflett.wordpress.com/2008/05/15/sample-series-idataerrorinfo-and-the-infragistics-xamdatagrid/" target="_blank"&gt;here&lt;/a&gt;.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=15076" width="1" height="1"&gt;</description></item><item><title>Creating Objects that Support Edit Cancellation via IEditableObject</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/05/08/creating-objects-that-support-edit-cancellation-via-ieditableobject.aspx</link><pubDate>Thu, 08 May 2008 13:17:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:15006</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/15006.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=15006</wfw:commentRss><description>&lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject.aspx" target="_blank"&gt;IEditableObject&lt;/a&gt; interface provides controls with a way
to allow a data source to react intelligently to being edited.&amp;nbsp; This might seem superfluous, until you
consider that complex controls, such as a data grid, allow the user to cancel
an editing session via the Escape key.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;For example, suppose the user is editing a row in the
UltraGrid or XamDataGrid, and then realizes that he has been editing the wrong
row.&amp;nbsp; If he presses the Escape key once,
the grid automatically reverts the active cell to the value it had before
editing began.&amp;nbsp; If the user hits Escape
again, the entire row reverts to the values it had before the user started to
edit its cells.&lt;/p&gt;

&lt;p&gt;If the grid is bound to an ADO.NET container, such as
DataTable, all of this magic happens for us automatically.&amp;nbsp; However, if the grid is bound to a collection
of your own objects, such as custom business objects, this will not happen by
default.&amp;nbsp; Your business objects will need
to implement that logic, just as the ADO.NET containers do.&amp;nbsp; Perhaps your business objects will not
implement that functionality, since it is not part of any business domain, but
Presentation Model objects might, instead.&amp;nbsp;
Regardless of the lingo, at the end of the day you will need to
implement this logic somewhere!&lt;/p&gt;

&lt;p&gt;Fortunately, this is quite easy to do.&amp;nbsp; The IEditableObject interface is all you need
to implement, as seen below:&lt;/p&gt;&lt;p&gt;private BinaryFormatter _formatter = new BinaryFormatter();&lt;br&gt;private MyData _myState;&lt;br&gt;private MemoryStream _snapshot;&lt;/p&gt;&lt;p&gt;&lt;br&gt;void IEditableObject.BeginEdit()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_snapshot != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _snapshot = new MemoryStream();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _formatter.Serialize(_snapshot, _myState);&lt;br&gt;}&lt;br&gt;&lt;br&gt;void IEditableObject.CancelEdit()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_snapshot == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Restore our state to the snapshot taken when the editing session began.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _snapshot.Position = 0;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _myState = _formatter.Deserialize(_snapshot) as MyData;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ThrowAwaySnapshot();&lt;br&gt;}&lt;br&gt;&lt;br&gt;void IEditableObject.EndEdit()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ThrowAwaySnapshot();&lt;br&gt;}&lt;br&gt;&lt;br&gt;void ThrowAwaySnapshot()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_snapshot != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _snapshot.Dispose();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _snapshot = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&lt;br&gt;

&lt;/p&gt;&lt;p&gt;This code assumes the MyData type (and all of its ancestor
types) is decorated with the Serializable attribute, since it is serialized by
the BinaryFormatter.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;The BeginEdit method starts with a check to see if we are
already in an editing session.&amp;nbsp; If so, it
immediately returns since there can only be one editing session at a time.&amp;nbsp; There is no guarantee regarding when and how
often that method will be invoked, so this precautionary step is
necessary.&amp;nbsp; When a new editing session
begins, a snapshot of the object's state is taken and stored in a MemoryStream.&lt;/p&gt;

&lt;p&gt;If the user cancels the editing session, the CancelEdit
method executes.&amp;nbsp; That method deserializes
the snapshot taken in BeginEdit, and applies the saved values to the editable
object.&amp;nbsp; If the IEditableObject instance contains
the various fields being edited, instead of having a reference to one object
that contains all the values, your CancelEdit method will include code that
sets all of those fields to whatever values were saved in the BeginEdit method.&lt;/p&gt;

&lt;p&gt;When the user completes an editing session (i.e. finishes
editing a row in the grid) the EndEdit method is invoked.&amp;nbsp; That gives us a chance to dispose of the
snapshot data.&amp;nbsp; Once the snapshot is
removed, a subsequent call to BeginEdit will cause a new editing session to
begin.&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=15006" width="1" height="1"&gt;</description></item><item><title>New version of Tangerine</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/03/28/new-version-of-tangerine.aspx</link><pubDate>Fri, 28 Mar 2008 18:06:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:14207</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/14207.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=14207</wfw:commentRss><description>&lt;p&gt;One of the reasons I love working at Infragistics is that we not only have awesome controls, but we also create cool real-world applications that put those controls to use.&amp;nbsp; Part of our mission here is to provide exemplary guidance on how to create modern user interfaces that provide great user experiences.&amp;nbsp; Those applications are referred to as 'exemplars.'&amp;nbsp; &lt;br&gt; &lt;/p&gt;&lt;p&gt;When I joined Infragistics (for the second time) we already had a WPF exemplar, &lt;a href="http://community.infragistics.com/exemplars/tangerine.aspx" title="Tangerine - a WPF exemplar" target="_blank"&gt;Tangerine&lt;/a&gt;. Now that NetAdvantage for WPF v7.2 has been released, and Visual Studio 2008 as well, we decided to upgrade Tangerine accordingly.&amp;nbsp; If would like to try out a free WPF-based e-commerce experience, read the source code, and review the documentation, please feel free to check it out! &lt;/p&gt;&lt;p&gt;&lt;a href="http://community.infragistics.com/exemplars/tangerine.aspx" title="Tangerine - a WPF exemplar"&gt;http://community.infragistics.com/exemplars/tangerine.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=14207" width="1" height="1"&gt;</description></item><item><title>Automatic Properties and the BinaryFormatter</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2008/02/04/automatic-properties-and-the-binaryformatter.aspx</link><pubDate>Tue, 05 Feb 2008 00:53:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:13014</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>12</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/13014.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=13014</wfw:commentRss><description>&lt;p&gt;When I first encountered the C# 3.0 feature known as &lt;span style="text-decoration:underline;"&gt;'&lt;/span&gt;&lt;a href="http://www.google.com/search?q=C%23+automatic+properties" target="_blank"&gt;automatic properties&lt;/a&gt;' I had two, almost simultaneous, thoughts: "Oh great!" and "Oh no!"&amp;nbsp; Here is an automatic property:&lt;/p&gt;&lt;p&gt;public int Bar { get; set; }&lt;br&gt;&lt;/p&gt;&lt;p&gt;This property does not reference a field, but I assure you it compiles just fine. This is very convenient for when you want to quickly add a property to a type, but do not want to bother typing all of this:&lt;/p&gt;&lt;p&gt;private int _bar;&lt;br&gt;public int Bar&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _bar; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _bar = value; }&lt;br&gt;}&lt;br&gt;&lt;/p&gt;&lt;p&gt;I was concerned about this great new language feature.&amp;nbsp; More than a few times in the past I have been burnt by the &lt;a href="http://technet.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx" target="_blank"&gt;BinaryFormatter&lt;/a&gt;.&amp;nbsp; I would serialize an instance of a class, save it to disk, upgrade the DLL containing the class of the serialized object, and encounter an exception when deserializing that object during a subsequent run of the app.&amp;nbsp; If the type that has instances serialized was given a new field, had a field removed, or had a field renamed, the BinaryFormatter would throw an exception.&amp;nbsp; It demanded that the object being deserialized matched the type as which it was being instantiated.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Here was my line of thinking...An automatic property uses a compiler-generated field as its backing store.&amp;nbsp; The name of that field is, practically speaking, random nonsense.&amp;nbsp; If I later decide to turn an automatic property into a normal property, with a corresponding field, I will have to change the name of that field.&amp;nbsp; The auto-generated field will disappear and my field will instead be used.&amp;nbsp; In that situation, wouldn't the BinaryFormatter throw an exception when deserializing an instance of the class, if it was serialized when the class still had an automatic property (with a compiler-generated field name)?&amp;nbsp; If so, that would be a subtle and nasty bug to track down!&lt;/p&gt;&lt;p&gt;I performed a test and discovered that this issue leaves us, the software debuggers of the world, in a bad situation.&amp;nbsp; It seems that BinaryFormatter has mellowed with age.&amp;nbsp; It does not throw exceptions any more when a field in the class is renamed or removed between object serialization and deserialization.&amp;nbsp; Instead, it just ignores the situation and moves on.&amp;nbsp; What this means is that, upon deserialization, the property that used to be "automatic" will no longer have its previous value.&amp;nbsp; Since its corresponding backing field was renamed, it is no longer set by BinaryFormatter.&amp;nbsp; To be honest, I would prefer that an exception was thrown in this situation just so that I knew right away that there was a problem. This is something to keep in mind when using and altering automatic properties in serializable types.&lt;/p&gt;&lt;p&gt;Here is the console app I created to test this:&lt;/p&gt;&lt;p&gt;#define AUTO&lt;br&gt;&lt;br&gt;using System;&lt;br&gt;using System.IO;&lt;br&gt;using System.Runtime.Serialization.Formatters.Binary;&lt;br&gt;&lt;br&gt;namespace AutomaticPropertyTest&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Foo foo = null; &lt;br&gt;&lt;br&gt;#if AUTO&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo = new Foo();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo.Bar = 42;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Writing Foo with automatic property to file...");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (FileStream strm = new FileStream("asdf.dat", FileMode.Create))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new BinaryFormatter().Serialize(strm, foo);&lt;br&gt;#else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Reading Foo with explicit backing field from file...");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (FileStream strm = new FileStream("asdf.dat", FileMode.Open))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foo = new BinaryFormatter().Deserialize(strm) as Foo;&lt;br&gt;#endif&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("foo.Bar = " + foo.Bar);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadKey();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Serializable]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Foo&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;#if AUTO&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Bar { get; set; }&lt;br&gt;#else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int _bar;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Bar&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _bar; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value &amp;lt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentOutOfRangeException("value");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _bar = value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;#endif&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;First run the app with the AUTO token defined.&amp;nbsp; That will save an instance of the Foo class to disk, with an automatic property called Bar.&amp;nbsp; Then comment out the AUTO token definition and run again.&amp;nbsp; This replaces the Bar property with a "normal" property and field, and deserializes the Foo object from disk.&amp;nbsp; The result is that Bar, which was previously set to 42, will return 0.&amp;nbsp; In a real debugging scenario, this could be a nightmare to track down, especially if you were not aware of this subtle side-effect of altering automatic properties.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I think a good rule of thumb is: &lt;b&gt;do not use automatic properties in serializable types&lt;/b&gt;.&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=13014" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/joshs/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Listen to NY Times Podcasts with Silverlight 2.0</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2007/12/17/listen-to-ny-times-podcasts-with-silverlight-2.aspx</link><pubDate>Mon, 17 Dec 2007 21:52:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:12001</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/12001.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=12001</wfw:commentRss><description>&lt;P&gt;I have spent a lot of time recently coming up to speed with Silverlight 2.0.&amp;nbsp; It is the alpha version of Silverlight that is programmable via .NET languages, such as C# and VB.NET.&amp;nbsp; It has been an interesting adventure so far, and I am excited to see how this platform matures.&amp;nbsp; Coming from a strong WPF background, I feel that there are many things missing in Silverlight, but the potential for a great cross-platform, cross-browser UI technology is definitely there.&amp;nbsp;&amp;nbsp; If you would like to read my thoughts about how Silverlight 2.0 compares to WPF, feel free to read &lt;A class="" href="http://joshsmithonwpf.wordpress.com/2007/12/13/my-first-experience-with-silverlight-2/" target=_blank&gt;this post&lt;/A&gt; on my other blog.&lt;/P&gt;
&lt;P&gt;As of this writing SL has limited support for calling Web services.&amp;nbsp; You can only call a service that is hosted on the server to which you deployed the SL application, and the data returned by that service must be serialized as JSON (instead of SOAP).&amp;nbsp; Despite those limitations, you can still perform remote procedure calls and create data-driven applications.&amp;nbsp; Add in the fact that Silverlight has the Downloader class, which can download resources from the Web, and you have some very powerful tools at your disposal.&amp;nbsp; This post shows how I put those tools to use, by creating a simple Silverlight 2.0 application that allows you to listen to the latest podcasts published by The New York Times.&amp;nbsp; You can download the source code at the&amp;nbsp;bottom of this post.&lt;/P&gt;
&lt;P&gt;Here is a screenshot of the application in action:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://users.infragistics.com/joshs/agPodcast_screenshot.png"&gt;&lt;/P&gt;
&lt;P&gt;This application has several parts, none of which is too complicated.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Silverlight UI&lt;/STRONG&gt; - A Page that contains the various elements/controls seen in the above image. The Page's code-behind calls into a Web service that returns information about all of the podcasts to display, updates TextBlocks as the state of the application changes, and starts playing a podcast when the user selects an item in the list. The UI code and XAML can be found in the SilverlightApp project.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Custom ListBox Control&lt;/STRONG&gt; - Since the current build of Silverlight 2.0 has very few built-in controls, I used my AgListBox control to display all of the podcasts. I could have used the ListBox control provided in the SDK samples, but that control does not support keyboard navigation through its items. I wanted to have keyboard navigation, so I used my custom control instead. The AgListBox control source code can be found in the AgControls project.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Web Service&lt;/STRONG&gt; - The SL client app asynchronously calls a Web service which returns the name and URL of every available podcast. The service includes screen-scraping code that uses regular expressions to parse out the podcast information from &lt;A class="" href="http://www.nytimes.com/ref/multimedia/podcasts.html" target=_blank&gt;a Web page&lt;/A&gt;&amp;nbsp;downloaded from the New York Times web site. I would like to give special thanks to &lt;A class="" href="http://karlshifflett.wordpress.com/" target=_blank&gt;Karl Shifflett&lt;/A&gt;&amp;nbsp;for his great advice on how to screen-scrape the HTML doc. The NytPodcastService and screen-scraping code is in the SilverlightHost project.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The first thing I did was follow &lt;A class="" href="http://blogs.msdn.com/bobfamiliar/archive/2007/08/30/adopting-silverlight-an-architects-point-of-view.aspx" target=_blank&gt;Bob Familiar's lucid walkthrough&lt;/A&gt;&amp;nbsp;of how to set up a Visual Studio solution so that you can develop and debug a Silverlight 2.0 application that consumes a Web service.&amp;nbsp; Once I got past that initial hurdle, it was smooth sailing.&lt;/P&gt;
&lt;P&gt;The NytPodcastService Web service is small and simple.&amp;nbsp; Here is the Web method:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="WIDTH:614px;HEIGHT:298px;" height=298 src="http://users.infragistics.com/joshs/agPodcast_service.png" width=614&gt;&lt;BR&gt;&lt;BR&gt;Unfortunately at the time of this writing there is no RSS feed to get the latest podcasts from the Times.&amp;nbsp; Instead I download their Podcasts page and scrape the data I need from it.&amp;nbsp; That method is called from the Web method, as seen above.&amp;nbsp; Here is the screen-scraping code:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://users.infragistics.com/joshs/agPodcast_service_scraper.png"&gt;&lt;/P&gt;
&lt;P&gt;Once that Web service exists, the rest of the development effort is all about figuring out how to display the data and allow the user to play the podcasts.&amp;nbsp; The UI seen in the demo application is rather primitive and ugly, but enhancing it should be straightforward now that the core application exists.&amp;nbsp; The XAML for the Silverlight page is below:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://users.infragistics.com/joshs/agPodcast_page_xaml.png"&gt;&lt;/P&gt;
&lt;P&gt;The MediaElement named ‘_podcastPlayer' is what we use to play the podcasts, which are MP3 files.&amp;nbsp; You do not see that element on the screen; but since podcasts have no video associated with them...that is OK with me. &lt;img src="http://blogs.infragistics.com/emoticons/emotion-15.gif" alt="Geeked" /&gt;&lt;/P&gt;
&lt;P&gt;We will not review every line of code in the Page's code-behind, but I think it is interesting to see how the Silverlight app communicates with the Web service.&amp;nbsp; The code seen below explains how this communication takes place.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://users.infragistics.com/joshs/agPodcast_page_code.png"&gt;&lt;/P&gt;
&lt;P&gt;If you are familiar with using Web services, this code should look very familiar.&amp;nbsp; Since Silverlight 2.0 currently has a reduced version of the .NET framework, you can leverage your existing knowledge and skills when moving into Silverlight development.&lt;/P&gt;
&lt;P&gt;Download the demo &lt;A class="" title="Download the demo project" href="http://users.infragistics.com/joshs/NytPodcastBrowserDemo.zip"&gt;here&lt;/A&gt;.&amp;nbsp; You will need Visual Studio 2008 and the Silverlight 2.0 alpha installed on your machine to build and run this solution.&amp;nbsp; When running the application, be sure to set the SilverlightHost project as the Startup Project.&lt;/P&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=12001" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/joshs/archive/tags/xaml/default.aspx">xaml</category><category domain="http://blogs.infragistics.com/blogs/joshs/archive/tags/podcast/default.aspx">podcast</category><category domain="http://blogs.infragistics.com/blogs/joshs/archive/tags/web+service/default.aspx">web service</category><category domain="http://blogs.infragistics.com/blogs/joshs/archive/tags/silverlight/default.aspx">silverlight</category></item><item><title>The Debugger Visualizer Item Template in VS2008 is Broken</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2007/12/15/the-debugger-visualizer-item-template-in-vs2008-is-broken.aspx</link><pubDate>Sat, 15 Dec 2007 23:24:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:11959</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/11959.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=11959</wfw:commentRss><description>&lt;P&gt;Someone at Microsoft forgot to update the Debugger Visualizer item template for Visual Studio 2008.&amp;nbsp;&amp;nbsp;Suppose that you&amp;nbsp;add a visualizer to your project by selecting the "Debugger Visualizer" item template, as seen below:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://users.infragistics.com/JoshS/BadVisualizerDemo_AddNewItem.png"&gt;&lt;/P&gt;
&lt;P&gt;The template automatically adds a bunch of boilerplate code so that you can easily get started with writing your own visualizer.&amp;nbsp; That's all well and good, but when you actually give your shiny new visualizer a test drive, you will be told that the CLR was "Unable to cast object of type '&lt;EM&gt;Your Visualizer Type&lt;/EM&gt;' to type 'Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer'."&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://users.infragistics.com/JoshS/BadVisualizerDemo_Error.png"&gt;&lt;/P&gt;
&lt;P&gt;You can avoid this problem in several ways.&amp;nbsp; Naturally, you can take the high road and&amp;nbsp;avoid using the item template in the first place.&amp;nbsp; If you are like me, that is a bad option because, in general, automation is a good thing.&amp;nbsp; Work smart, not hard!&lt;/P&gt;
&lt;P&gt;You can do the "right" thing and actually fix the Debugger Visualizer item template itself.&amp;nbsp; That would probably be an interesting adventure into the world of Visual Studio template files, and would forever solve this problem on your machine.&amp;nbsp; But, if you are like me, this option sounds like too much work considering that you&amp;nbsp;might never use the Debugger Visualizer item template again.&amp;nbsp; It isn't broken if you don't use it, right? ;)&lt;/P&gt;
&lt;P&gt;It turns out that&amp;nbsp;we can spend just a few seconds to fix the problem at hand.&amp;nbsp; Here's the problem: the Microsoft.VisualStudio.DebuggerVisualizers.dll assembly reference that is added to your project by the template is the wrong version.&amp;nbsp; Observe:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://users.infragistics.com/JoshS/BadVisualizerDemo_WrongAssembly.png"&gt;&lt;/P&gt;
&lt;P&gt;Notice how the Version of the assembly is 8.0.0.0.&amp;nbsp; That's the problem.&amp;nbsp; That's the version of the assembly which shipped with VS2005.&amp;nbsp; The Debugger Visualizer item template should have added Version 9.0.0.0 instead.&amp;nbsp;All that you have to do is delete that assembly reference and add a new one, which references the correct version of the Microsoft.VisualStudio.DebuggerVisualizers.dll assembly.&amp;nbsp; The screenshot below shows the proper assembly to reference:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://users.infragistics.com/JoshS/BadVisualizerDemo_AddCorrectAssembly.png"&gt;&lt;/P&gt;
&lt;P&gt;After you add that assembly reference, rebuild the project, and redeploy your visualizer, the exception seen previously does not get thrown.&amp;nbsp; Note, however, that if you intend on using your visualizer in both VS2005 and VS2008, you must have two separate builds since each version of Visual Studio requires a different version of that DebuggerVisualizers assembly to be referenced.&lt;/P&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=11959" width="1" height="1"&gt;</description><category domain="http://blogs.infragistics.com/blogs/joshs/archive/tags/VS2008/default.aspx">VS2008</category><category domain="http://blogs.infragistics.com/blogs/joshs/archive/tags/visualizer/default.aspx">visualizer</category></item><item><title>Mole for Visual Studio</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2007/12/14/mole-for-visual-studio.aspx</link><pubDate>Fri, 14 Dec 2007 20:34:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:11938</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/11938.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=11938</wfw:commentRss><description>&lt;P&gt;There have been many iterations of the Mole visualizer.&amp;nbsp; The latest and greatest release is not confined to WPF applications, it works with any application!!&amp;nbsp; &lt;A class="" href="http://karlshifflett.wordpress.com/" target=_blank&gt;Karl Shifflett&lt;/A&gt; and &lt;A class="" href="http://agsmith.wordpress.com/" target=_blank&gt;Andrew Smith&lt;/A&gt; (of Infragistics) have really hit the ball out of the park.&amp;nbsp; I helped out with testing, editing the article, and providing feedback.&amp;nbsp; I've been too busy learning Silverlight 1.1 to keep up with their amazing pace.&amp;nbsp; Great work guys!&lt;/P&gt;
&lt;P&gt;Read the article and get the latest Mole for Visual Studio here: &lt;A href="http://www.codeproject.com/KB/macros/MoleForVisualStudio.aspx"&gt;http://www.codeproject.com/KB/macros/MoleForVisualStudio.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=11938" width="1" height="1"&gt;</description></item><item><title>Welcome to my new blog!</title><link>http://blogs.infragistics.com/blogs/joshs/archive/2007/12/13/welcome-to-my-new-blog.aspx</link><pubDate>Thu, 13 Dec 2007 21:59:00 GMT</pubDate><guid isPermaLink="false">7a8b7c76-b7ad-48e0-9694-5b04ca132ed0:11925</guid><dc:creator>Joshua Smith</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.infragistics.com/blogs/joshs/comments/11925.aspx</comments><wfw:commentRss>http://blogs.infragistics.com/blogs/joshs/commentrss.aspx?PostID=11925</wfw:commentRss><description>&lt;P&gt;Hi, I'm Josh Smith.&amp;nbsp; I recently re-joined Infragistics, as a Guidisan in the User Experience Group.&amp;nbsp; When I worked here before, I was a developer in the WinForms lab.&amp;nbsp; It's great to be back at Infragistics!&lt;/P&gt;
&lt;P&gt;For those of you in the WPF world, you might know of my other blog: &lt;A class="" title="My other blog" href="http://joshsmithonwpf.wordpress.com/" target=_blank&gt;Josh Smith On WPF&lt;/A&gt;&amp;nbsp;That blog is devoted to WPF.&amp;nbsp; This blog is not devoted to any particular technology, so be prepared for this blog to visit many strange and interesting technical worlds.&amp;nbsp; Considering that a substantial part of my job as a Guidisan is to keep abreast of cutting edge technologies, this blog will touch on many different places in the .NET Universe.&lt;/P&gt;
&lt;P&gt;So fasten your seat belt, keep your arms in the blog at all times, and join me as I have fun! &lt;img src="http://blogs.infragistics.com/emoticons/emotion-11.gif" alt="Cool" /&gt;&lt;/P&gt;&lt;img src="http://blogs.infragistics.com/aggbug.aspx?PostID=11925" width="1" height="1"&gt;</description></item></channel></rss>