<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.infragistics.com/community/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Josh Smith</title><subtitle type="html" /><id>http://www.infragistics.com/community/blogs/josh_smith/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.infragistics.com/community/blogs/josh_smith/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.infragistics.com/community/blogs/josh_smith/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.36.8414">Community Server</generator><updated>2008-05-23T13:33:00Z</updated><entry><title>Infragistics WPF Controls in a Composite Application</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2009/01/12/infragistics-wpf-controls-in-a-composite-application.aspx" /><id>/community/blogs/josh_smith/archive/2009/01/12/infragistics-wpf-controls-in-a-composite-application.aspx</id><published>2009-01-12T21:21:00Z</published><updated>2009-01-12T21:21:00Z</updated><content type="html">&lt;p&gt;Infragistics recently released the &lt;a href="http://www.codeplex.com/ncal/"&gt;NetAdvantage for Composite Application Library&lt;/a&gt; (NCAL) on CodePlex.&amp;nbsp; NCAL enables Infragistics WPF controls to be used in a composite application, based on Microsoft’s &lt;a href="http://www.codeplex.com/CompositeWPF/"&gt;Composite Application Library&lt;/a&gt;.&amp;nbsp; At this time, the library offers a region adapter for &lt;a href="http://www.infragistics.com/dotnet/netadvantage/wpf/xamdockmanager.aspx#Overview"&gt;XamDockManager&lt;/a&gt;, a sample composite application that uses NCAL, a Quick Start document, and a suite of unit tests that can be used to review the classes it contains.&lt;/p&gt;&lt;p&gt;A composite application consists of independent modules of functionality that are hooked together at run time by an application framework, such as CAL.&amp;nbsp; Each module can inject a View (i.e. a user interface of some kind) into a window of the shell application.&amp;nbsp;&amp;nbsp; The modules can communicate with each other via services registered with the application framework, and subscribe to events with an event broker.&amp;nbsp; This is a popular architecture for large-scale applications built by geographically dispersed teams.&lt;/p&gt;&lt;p&gt;In order for a WPF control to be used in a composite application based on CAL, there must be a &lt;i&gt;region adapter&lt;/i&gt; registered for it.&amp;nbsp; Region adapters act as a layer of indirection between the CAL framework and UI controls, allowing a control to be used in a generic fashion by the framework.&amp;nbsp; For example, when CAL adds a View to a Region, the region adapter for XamDockManager must add the View control to an Infragistics docking window.&amp;nbsp; When the user closes the docking window, the region adapter must tell CAL to remove the View from the Region.&amp;nbsp; In this sense, a region adapter keeps a UI control in sync with the state of CAL’s object model.&lt;/p&gt;&lt;p&gt;Composite applications usually have a large number of Views to display in the user interface.&amp;nbsp; A popular way to organize these views is to put them into docking windows, as seen in Visual Studio.&amp;nbsp; XamDockManager provides that frequently needed functionality, which is why we built a region adapter for it first.&amp;nbsp; The NCAL solution contains a sample application which consists of several modules and a shell project, showing the &lt;b&gt;XamDockManagerRegionAdapter&lt;/b&gt; in use.&amp;nbsp; If you are interested in using NCAL, be sure to read the Quick Start document, also included in the NCAL solution, because it explains everything you need to know to get started.&lt;/p&gt;&lt;p&gt;If you are building composite applications in WPF, I hope you find NCAL useful.&amp;nbsp; We encourage you to give us your feedback and thoughts about the library!&amp;nbsp; &lt;/p&gt;&lt;p&gt;You can:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Download the latest source code drop on the &lt;a href="http://www.codeplex.com/ncal/SourceControl/ListDownloadableCommits.aspx"&gt;Source Code&lt;/a&gt; page&lt;/li&gt;&lt;li&gt; Start a discussion, or ask a question, about NCAL on the &lt;a href="http://www.codeplex.com/ncal/Thread/List.aspx"&gt;Discussions&lt;/a&gt; page&lt;/li&gt;&lt;li&gt;Report a defect on the &lt;a href="http://www.codeplex.com/ncal/WorkItem/List.aspx"&gt;Issue Tracker&lt;/a&gt; page&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Happy coding!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77436" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author><category term="ncal" scheme="http://www.infragistics.com/community/blogs/josh_smith/archive/tags/ncal/default.aspx" /><category term="wpf" scheme="http://www.infragistics.com/community/blogs/josh_smith/archive/tags/wpf/default.aspx" /></entry><entry><title>Putting Silverlight Commands to Use</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/11/18/putting-silverlight-commands-to-use.aspx" /><id>/community/blogs/josh_smith/archive/2008/11/18/putting-silverlight-commands-to-use.aspx</id><published>2008-11-18T07:39:00Z</published><updated>2008-11-18T07:39:00Z</updated><content type="html">&lt;p&gt;In the current release of Silverlight, we have the ICommand interface, which defines a command object, just like in WPF.&amp;nbsp; However, unlike WPF, it seems that Silverlight does not have any built-in support for actually using ICommand objects just yet.&amp;nbsp; This blog post shows how we can work around this&amp;nbsp;shortcoming until the platform has proper support for command sources (such as the ICommandSource interface in WPF).&amp;nbsp; My implementation allows you to execute commands when any ButtonBase-derived control is clicked, pass the command a parameter, and honor the can-execute status of the command (when CanExecute returns false, the button automatically becomes disabled).&lt;/p&gt;
&lt;p&gt;In case you are wondering why I bothered implementing this, bear in mind that I’m a huge fan of the Model-View-ViewModel (MVVM) pattern.&amp;nbsp; One of the fundamental principles in MVVM is that the View consumes functionality of the ViewModel by executing commands exposed by the ViewModel.&amp;nbsp; In order to execute a command, you need to have UI controls that are able to do so, such as when a Button executes a command upon being clicked.&lt;/p&gt;
&lt;p&gt;I created a static class called ButtonBaseExtensions, which exposes two attached properties.&amp;nbsp; These properties can only be set on ButtonBase subclasses.&amp;nbsp; The Command attached property is of type ICommand, and it allows you to specify which command should execute when the button is clicked.&amp;nbsp; The CommandParameter attached property is of type Object, and is used to pass an optional parameter value to the CanExecute and Execute methods of the command.&amp;nbsp; You can see these two properties in use here:&lt;/p&gt;
&lt;p&gt;&amp;lt;Button &lt;br /&gt;&amp;nbsp; Content=&amp;quot;Capitalize&amp;quot; &lt;br /&gt;&amp;nbsp; cmd:ButtonBaseExtensions.Command=&amp;quot;{Binding CapitalizeCommand}&amp;quot; &lt;br /&gt;&amp;nbsp; /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Button &lt;br /&gt;&amp;nbsp; Content=&amp;quot;Remove One Letter&amp;quot; &lt;br /&gt;&amp;nbsp; Margin=&amp;quot;6,0&amp;quot;&lt;br /&gt;&amp;nbsp; cmd:ButtonBaseExtensions.Command=&amp;quot;{Binding RemoveSubstringCommand}&amp;quot; &lt;br /&gt;&amp;nbsp; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;cmd:ButtonBaseExtensions.CommandParameter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sys:Int32&amp;gt;1&amp;lt;/sys:Int32&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/cmd:ButtonBaseExtensions.CommandParameter&amp;gt;&lt;br /&gt;&amp;lt;/Button&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;HyperlinkButton &lt;br /&gt;&amp;nbsp; Content=&amp;quot;Remove Two Letters&amp;quot; &lt;br /&gt;&amp;nbsp; cmd:ButtonBaseExtensions.Command=&amp;quot;{Binding RemoveSubstringCommand}&amp;quot; &lt;br /&gt;&amp;nbsp; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;cmd:ButtonBaseExtensions.CommandParameter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sys:Int32&amp;gt;2&amp;lt;/sys:Int32&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/cmd:ButtonBaseExtensions.CommandParameter&amp;gt;&lt;br /&gt;&amp;lt;/HyperlinkButton&amp;gt;&lt;/p&gt;
&lt;p&gt;The main point of interest in the demo app is in the ButtonBaseExtensions class.&amp;nbsp; Here is most of the code involved with the Command attached property.&amp;nbsp; Note, all references to ICommands and ButtonBase objects are stored in WeakReferences, so this will not create a memory leak.&lt;/p&gt;
&lt;p&gt;static readonly CommandToButtonsMap s_commandToButtonsMap = new CommandToButtonsMap();&lt;/p&gt;
&lt;p&gt;public static ICommand GetCommand(ButtonBase btn)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (ICommand)btn.GetValue(CommandProperty);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;public static void SetCommand(ButtonBase btn, ICommand value)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; btn.SetValue(CommandProperty, value);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;public static readonly DependencyProperty CommandProperty =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DependencyProperty.RegisterAttached(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Command&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof(ICommand),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof(ButtonBaseExtensions),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new PropertyMetadata(null, OnCommandChanged));&lt;/p&gt;
&lt;p&gt;static void OnCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ButtonBase btn = obj as ButtonBase;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (btn == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentException(&amp;quot;...&amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICommand oldCommand = e.OldValue as ICommand;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (oldCommand != 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; s_commandToButtonsMap.RemoveButtonFromMap(btn, oldCommand);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oldCommand.CanExecuteChanged -= OnCommandCanExecuteChanged;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; btn.Click -= OnButtonBaseClick;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICommand newCommand = e.NewValue as ICommand;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (newCommand != 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; s_commandToButtonsMap.AddButtonToMap(btn, newCommand);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newCommand.CanExecuteChanged += OnCommandCanExecuteChanged;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; btn.Click += OnButtonBaseClick;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;static void OnCommandCanExecuteChanged(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICommand cmd = sender as ICommand;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (cmd != null &amp;amp;&amp;amp; s_commandToButtonsMap.ContainsCommand(cmd))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s_commandToButtonsMap.ForEachButton(cmd, btn =&amp;gt;&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; object parameter = ButtonBaseExtensions.GetCommandParameter(btn);&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; btn.IsEnabled = cmd.CanExecute(parameter);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;static void OnButtonBaseClick(object sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ButtonBase btn = sender as ButtonBase;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ICommand cmd = ButtonBaseExtensions.GetCommand(btn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; object parameter = ButtonBaseExtensions.GetCommandParameter(btn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (cmd != null &amp;amp;&amp;amp; cmd.CanExecute(parameter))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Execute(parameter);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;Download the demo app &lt;a class="" href="http://users.infragistics.com/joshs/SLCommandingDemo.zip"&gt;here&lt;/a&gt;.&amp;nbsp; It was created against Silverlight 2, using Visual Studio 2008 SP1.&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77425" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author><category term="silverlight" scheme="http://www.infragistics.com/community/blogs/josh_smith/archive/tags/silverlight/default.aspx" /></entry><entry><title>How to avoid typing FieldLayout XAML</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/10/03/how-to-avoid-typing-fieldlayout-xaml.aspx" /><id>/community/blogs/josh_smith/archive/2008/10/03/how-to-avoid-typing-fieldlayout-xaml.aspx</id><published>2008-10-03T21:14:00Z</published><updated>2008-10-03T21:14:00Z</updated><content type="html">&lt;p&gt;Here&amp;#39;s a trick that was inspired by a recent question in a &lt;a href="http://forums.infragistics.com/forums/t/14393.aspx"&gt;forum post&lt;/a&gt;.&amp;nbsp; XamDataGrid will automatically create FieldLayouts and Fields for you, based on the type of data source you give it.&amp;nbsp; If you want to customize the layouts or fields, you can do so by creating those objects in XAML (or code) and configuring their properties.&amp;nbsp; The downside is that you have to manually type that XAML, which can be time consuming.&amp;nbsp; In this post, I&amp;#39;ll show how you can easily leverage XamDataGrid&amp;#39;s automatic field generation capabilities in such a way that you don&amp;#39;t have to type in all that boilerplate XAML.&lt;/p&gt;&lt;p&gt;The idea is to let the data grid create the FieldLayouts and Fields, and in a handler for the FieldLayoutInitialized event you create some XAML on-the-fly.&amp;nbsp; That XAML can then be written to a file, or to the Windows clipboard, or even to the Output window in Visual Studio.&amp;nbsp; For example, suppose that this is my XAML file:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;lt;Window &lt;br /&gt;&amp;nbsp; x:Class=&amp;quot;XamDataGridTest.Window1&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:igDP=&amp;quot;http://infragistics.com/DataPresenter&amp;quot;&lt;br /&gt;&amp;nbsp; Title=&amp;quot;XamDataGrid Test&amp;quot; &lt;br /&gt;&amp;nbsp; Width=&amp;quot;640&amp;quot; Height=&amp;quot;480&amp;quot; &lt;br /&gt;&amp;nbsp; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Grid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&amp;lt;igDP:XamDataGrid DataSource=&amp;quot;{Binding}&amp;quot; x:Name=&amp;quot;xamDG&amp;quot; /&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/Window&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Here is the code-behind file for that window:&lt;/p&gt;&lt;p&gt;using System.Diagnostics;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Windows;&lt;br /&gt;using Infragistics.Windows.DataPresenter;&lt;br /&gt;using Infragistics.Windows.DataPresenter.Events;&lt;br /&gt;&lt;br /&gt;namespace XamDataGridTest&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public partial class Window1 : Window&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; public Window1()&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; InitializeComponent();&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; base.DataContext = Task.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; this.xamDG.FieldLayoutInitialized += this.xamDG_FieldLayoutInitialized;&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; void xamDG_FieldLayoutInitialized(object sender, FieldLayoutInitializedEventArgs e)&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; string xaml = GetXamlForFieldLayout(e.FieldLayout);&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; Debug.WriteLine(xaml);&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; static string GetXamlForFieldLayout(FieldLayout 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder buffer = new StringBuilder();&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; buffer.AppendLine(&amp;quot;&amp;lt;igDP:FieldLayout&amp;gt;&amp;quot;);&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; buffer.AppendLine(&amp;quot;&amp;nbsp; &amp;lt;igDP:FieldLayout.Fields&amp;gt;&amp;quot;);&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; foreach (Field field in 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; {&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 (field.IsExpandableResolved == false)&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; {&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; buffer.AppendFormat(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=\&amp;quot;{0}\&amp;quot; /&amp;gt;&amp;quot;, field.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer.AppendLine();&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; }&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; buffer.AppendLine(&amp;quot;&amp;nbsp; &amp;lt;/igDP:FieldLayout.Fields&amp;gt;&amp;quot;);&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; buffer.Append(&amp;quot;&amp;lt;/igDP:FieldLayout&amp;gt;&amp;quot;);&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 buffer.ToString();&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;/p&gt;&lt;p&gt;I suppose a more &amp;quot;robust&amp;quot; solution would be to use either an XmlTextWriter, or some XLinq, here.&amp;nbsp; But, for this simple demo, I&amp;#39;m just using plain string concatenations. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;When I run the application by pressing F5 (i.e. in Debug mode), the following XAML is sent to the Output window:&lt;/p&gt;&lt;p&gt;&amp;lt;igDP:FieldLayout&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;igDP:FieldLayout.Fields&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;ID&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;Name&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;PriorityLevel&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;State&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/igDP:FieldLayout.Fields&amp;gt;&lt;br /&gt;&amp;lt;/igDP:FieldLayout&amp;gt; &lt;/p&gt;&lt;p&gt;Each of those Fields corresponds to a property on the Task class in my application.&amp;nbsp; My data source is hierarchical.&amp;nbsp; The Task class has a property called Notes, which is an array of TaskNote objects.&amp;nbsp; The first time I expand one of the records, the FieldLayout used to display a TaskNote object is initialized.&amp;nbsp; That causes the following XAML to be sent to the Output window:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;lt;igDP:FieldLayout&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;igDP:FieldLayout.Fields&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;CreatedOn&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;Notes&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/igDP:FieldLayout.Fields&amp;gt;&lt;br /&gt;&amp;lt;/igDP:FieldLayout&amp;gt;&lt;/p&gt;&lt;p&gt;Now I can copy and paste that XAML into my Window&amp;#39;s XAML file, adjust the FieldLayouts and Fields as I see fit, and then remove the FieldLayoutInitialized handler so that this design-time code does not run in the production application.&amp;nbsp; The resulting XAML file, after I apply some changes to the Fields, looks like this:&lt;/p&gt;&lt;p&gt;&amp;lt;Window&lt;br /&gt;&amp;nbsp; x:Class=&amp;quot;XamDataGridTest.Window1&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:igDP=&amp;quot;http://infragistics.com/DataPresenter&amp;quot;&lt;br /&gt;&amp;nbsp; Title=&amp;quot;XamDataGrid Test&amp;quot;&lt;br /&gt;&amp;nbsp; Width=&amp;quot;640&amp;quot; Height=&amp;quot;480&amp;quot;&lt;br /&gt;&amp;nbsp; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Grid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:XamDataGrid DataSource=&amp;quot;{Binding}&amp;quot; x:Name=&amp;quot;xamDG&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:XamDataGrid.FieldLayouts&amp;gt;&lt;/p&gt;&lt;p&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 Name=&amp;quot;ID&amp;quot; Visibility=&amp;quot;Collapsed&amp;quot; /&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 Name=&amp;quot;Name&amp;quot; Label=&amp;quot;task name&amp;quot; /&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 Name=&amp;quot;PriorityLevel&amp;quot; Label=&amp;quot;priority level&amp;quot; /&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 Name=&amp;quot;State&amp;quot; Label=&amp;quot;status&amp;quot; /&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;/p&gt;&lt;p&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;&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;lt;igDP:Field Name=&amp;quot;CreatedOn&amp;quot; Label=&amp;quot;created&amp;quot;&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;lt;igDP:Field Name=&amp;quot;Notes&amp;quot; Label=&amp;quot;notes...&amp;quot; /&amp;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;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;/p&gt;&lt;p&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;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/Window&amp;gt;&lt;/p&gt;&lt;p&gt;Hopefully this trick will shave some time off your development efforts involving XamDataGrid.&amp;nbsp; Happy coding! &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77422" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author></entry><entry><title>Introducing a new XamDataGrid Behavior: DisplayAdorningEditors</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/09/15/introducing-a-new-xamdatagrid-behavior-displayadorningeditors.aspx" /><id>/community/blogs/josh_smith/archive/2008/09/15/introducing-a-new-xamdatagrid-behavior-displayadorningeditors.aspx</id><published>2008-09-15T08:40:00Z</published><updated>2008-09-15T08:40:00Z</updated><content type="html">&lt;p&gt;This blog post reviews a technique that can vastly reduce the amount of screen real estate required to display your application’s data in XamDataGrid.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/contax_screenshot_name.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In my &lt;a href="http://community.beta.infragistics.local/blogs/joshs/archive/2008/09/12/adorning-xamdatagrid-with-a-popup-editor.aspx"&gt;previous post&lt;/a&gt; on this blog, I showed how to display an extra field of data in the adorner layer, instead of putting it into a XamDataGrid cell.&amp;nbsp; Since writing that post, I have spent the entire weekend blissfully working on and expanding that core concept.&amp;nbsp; I managed to extract all of the plumbing code that hosts an editor in the adorner layer into a reusable class.&amp;nbsp; I also vastly enhanced and thoroughly tested this functionality.&amp;nbsp; In this blog post, I am proud to present the fruit of my labor: a new behavior for XamDataGrid called ‘DisplayAdorningEditors’.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Background&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Before going forward, let’s first take a step back and review why I built this behavior.&amp;nbsp; Most applications have a core subset of data that users refer to most.&amp;nbsp; When displaying data in a data grid, such as XamDataGrid, it can be tempting to simply display all of the data fields as separate columns in the grid.&amp;nbsp; This is convenient because it takes less time to set up, but in the bigger picture, this is usually not a good idea. &amp;nbsp;&lt;/p&gt;&lt;p&gt;There are, at least, two problems with this approach.&amp;nbsp; The user experience degrades because your users must now look at and sift through reams of irrelevant data.&amp;nbsp; Most people appreciate only seeing what they typically want to see, as long as finding the less frequently needed information is not a challenge.&amp;nbsp; In addition, either showing large amounts of data fields in a data grid requires the grid to be very wide, in which case it uses up more precious screen real estate, or it requires the dreaded horizontal scrolling (which most UI designers generally deem a bad thing). &amp;nbsp;&lt;/p&gt;&lt;p&gt;Ideally, you should only display the most relevant data in XamDataGrid, but make it easy for users to find the other, less frequently used information.&amp;nbsp; This improves the user experience and reduces the amount of screen real estate required by the grid.&amp;nbsp; My DisplayAdorningEditors behavior for XamDataGrid makes it easy to achieve this worthwhile goal.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Using DisplayAdorningEditors&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I created a class called XamDataGridBehavior.&amp;nbsp; That class can attach a behavior to XamDataGrid.&amp;nbsp; The attached behavior’s name is DisplayAdorningEditors.&amp;nbsp; When you attach this behavior to a XamDataGrid, you can specify a control to display in the adorner layer directly next to the active cell in the grid.&amp;nbsp; In case you are not familiar with WPF’s adorner layer yet, think of it as a pane of glass on top of your UI, in which any visual elements can render, and it is certain that they will draw on top of the UI underneath (“on top of” with regards to the Z axis, not the Y axis).&lt;/p&gt;&lt;p&gt;Setting the DisplayAdorningEditors attached property to true on the XamDataGrid is only half the battle.&amp;nbsp; You must assign a handler for the RequestAdorningEditor attached event, also exposed by my XamDataGridBehavior class.&amp;nbsp; Your event handling method is invoked when the DisplayAdorningEditors behavior needs to know what control, if any, to display in the adorner layer for the grid’s active cell (i.e. the value returned by its ActiveCell property).&amp;nbsp; Be aware, that event is raised quite often, so your application logic should always provide the same control instance(s), instead of new’ing up fresh control instances every time.&lt;/p&gt;&lt;p&gt;You can set this up in XAML, as seen in the following excerpt from the demo application’s ContaxControl user control:&lt;/p&gt;&lt;p&gt;&amp;lt;igDP:XamDataGrid&amp;nbsp; x:Name=&amp;quot;xamDG&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:igDP=&amp;quot;http://infragistics.com/DataPresenter&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:ext=&amp;quot;clr-namespace:XamDataGridExtensions;assembly=XamDataGridExtensions&amp;quot;&lt;br /&gt;&amp;nbsp; ext:XamDataGridBehavior.DisplayAdorningEditors=&amp;quot;True&amp;quot;&lt;br /&gt;&amp;nbsp; ext:XamDataGridBehavior.RequestAdorningEditor=&amp;quot;OnRequestAdorningEditor&amp;quot; &lt;br /&gt;&amp;nbsp; &amp;gt;&lt;br /&gt;&amp;nbsp; ...&lt;br /&gt;&amp;lt;/igDP:XamDataGrid&amp;gt;&lt;/p&gt;&lt;p&gt;Here is that user control’s code-behind file:&lt;/p&gt;&lt;p&gt;public partial class ContaxControl : UserControl&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; readonly ContactEmailControl _contactEmailControl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; readonly ContactPhoneNumbersControl _contactPhoneNumbersControl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; readonly ContactPhotoAndNotesControl _contactPhotoAndNotesControl;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ContaxControl()&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _contactEmailControl = new ContactEmailControl();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _contactPhoneNumbersControl = new ContactPhoneNumbersControl();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _contactPhotoAndNotesControl = new ContactPhotoAndNotesControl();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _contactEmailControl.Initialize(this.xamDG);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _contactPhoneNumbersControl.Initialize(this.xamDG);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _contactPhotoAndNotesControl.Initialize(this.xamDG);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.DataContext = Contact.CreateContacts();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void OnRequestAdorningEditor(object sender, RequestAdorningEditorRoutedEventArgs 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; switch (e.AdornedCell.Field.Name)&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; case &amp;quot;DisplayName&amp;quot;:&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; e.AdorningEditor = _contactPhotoAndNotesControl;&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; break;&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; case &amp;quot;CellPhone&amp;quot;:&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; e.AdorningEditor = _contactPhoneNumbersControl;&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; break;&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; case &amp;quot;PersonalEmail&amp;quot;:&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; e.AdorningEditor = _contactEmailControl;&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; break;&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; default:&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; Debug.Fail(&amp;quot;Unexpected Field: &amp;quot; + e.AdornedCell.Field.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&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; if (e.AdorningEditor != 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; e.AdorningEditor.DataContext = e.AdornedCell.Record.DataItem;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;Another hing to take note of is that your controls hosted in the adorner layer need to have some logic built in that handles keyboard navigation.&amp;nbsp; Since you can use any type of control as an adorning editor, my attached behavior cannot make any assumptions about how to handle keystrokes aimed at your control.&amp;nbsp; If you would like to see an example of how to implement this, in the demo application the keyboard interaction logic is in the ContactAdornerControlBase class.&lt;/p&gt;&lt;p&gt;Also, if you want my XamDataGridBehavior class to move focus to your adorning editor control when the user presses Tab, you must set your control&amp;#39;s &lt;b&gt;IsTabStop&lt;/b&gt; property to true.&amp;nbsp; If you do not, it is assumed that the user should not be able to navigate into the adorning editor control via the Tab key.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Contax - The Demo Application&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The best way to understand what this new behavior can do, and how to use it, is to look at the Contax demo application.&amp;nbsp; Contax is a very simple application that stores a list of personal contact information.&amp;nbsp; All of the data is read-only, except for the optional notes about each contact.&amp;nbsp; The point of this demo is not to see how to build a full-fledge application, but simply to see how to use the DisplayAdorningEditors behavior with XamDataGrid.&lt;/p&gt;&lt;p&gt;This screenshot shows Contax when it first starts up: &lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/contax_screenshot.png" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The XamDataGrid seen above shows four pieces of information about each contact in the list: gender, name, mobile phone number, and personal e-mail address.&amp;nbsp; The assumption is that the users of Contax would find that information to be the most pertinent to their average use of the program.&amp;nbsp; Naturally, deciding on what information is most pertinent for most users requires, for a real application, market research, user acceptance testing, and other related activities. &lt;/p&gt;&lt;p&gt;Now suppose that the user wants to know more about one of the contacts, perhaps Patricia McClellan.&amp;nbsp; After clicking on Patricia’s cell in the “name” column, the UI discloses more information about her, as seen below:&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/contax_screenshot_name.png" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;As seen above, we can now see a photograph, nickname, and notes about Patricia (a.k.a. Trish).&amp;nbsp; If Trish’s photo, nickname, and notes were displayed as separate columns in the data grid, the grid’s width would be considerably larger, and the users would have to look at information that they probably don&amp;#39;t care about too often.&lt;/p&gt;&lt;p&gt;At this point, the user decides to give Steven Rottingham a call.&amp;nbsp; She first calls his mobile phone, but Steven does not answer, so she decides to call his office phone instead.&amp;nbsp; To find Steven’s office number, the user clicks on the cell in the “mobile #” column to bring up a list of all phone numbers associated with Steven.&amp;nbsp; Here’s what that looks like:&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/contax_screenshot_phone.png" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Now the user decides to send Joe Barkley an e-mail, so she opens his list of e-mail addresses to find the right one.&amp;nbsp; After deciding which address to send the message to, she clicks the button next to that address and her default e-mail client opens up with that address in the To field.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/contax_screenshot_email.png" alt="" /&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If the user were to shorten the Contax window, and then click on Michelle’s name, the adorning editor displays above Michelle’s row, since there is not enough room to display it underneath.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/contax_screenshot_name_above.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;Download&lt;/b&gt;&lt;/p&gt;&lt;p&gt;You can download the source code and demo application &lt;a href="http://users.infragistics.com/joshs/contax.zip"&gt;here&lt;/a&gt; (4.27 MB).&amp;nbsp; The solution compiles in Visual Studio 2008 against NetAdvantage for WPF v8.1.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77406" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author><category term="wpf" scheme="http://www.infragistics.com/community/blogs/josh_smith/archive/tags/wpf/default.aspx" /></entry><entry><title>Adorning XamDataGrid with a Popup Editor</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/09/12/adorning-xamdatagrid-with-a-popup-editor.aspx" /><id>/community/blogs/josh_smith/archive/2008/09/12/adorning-xamdatagrid-with-a-popup-editor.aspx</id><published>2008-09-13T00:22:00Z</published><updated>2008-09-13T00:22:00Z</updated><content type="html">&lt;p&gt;In a &lt;a href="http://forums.infragistics.com/forums/t/13443.aspx" target="_blank"&gt;recent post on the XamDataGrid Forum&lt;/a&gt; someone asked how to add an additional editor to a cell when it goes into edit mode.&amp;nbsp; The scenario is that the data source objects have twenty four numeric properties, and each numeric property is accompanied by a text property that stores an explanation for why the numeric property was modified.&amp;nbsp; This is a common scenario for applications where creating a verbose audit trail is required.&amp;nbsp; The goal was to have the grid display only the numeric properties, but when a cell goes into edit mode, show an additional editor so that the user can explain why he/she is updating the numeric value.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This got me thinking.&amp;nbsp; I decided that putting another editor into the cell, while possible, might not produce the best user experience.&amp;nbsp; In my opinion, such “auxiliary” information should not interfere with the structure and layout of the core data in the grid.&amp;nbsp; I think of an explanation for why a cell’s value has changed as “metadata” about the cell, and, as such, it should be displayed outside of the cell.&amp;nbsp; In this blog post, I’ll show you how I took that metadata and hosted it in the adorner layer. &lt;/p&gt;&lt;p&gt;When you run the demo app, edit the value of a cell, and then press Tab, the UI looks like this (after typing in some text):&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/XamDataGrid_AdorningEditor_Editing.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;In that screenshot, the user edited the first cell in the third row.&amp;nbsp; This is why the &amp;quot;Change Reason&amp;quot; editor appears beneath it.&amp;nbsp; After entering in an explanation for the change, and pressing Tab again, the edited cell has a new background color and a tooltip, which shows the change reason.&amp;nbsp; It looks like this:&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/XamDataGrid_AdorningEditor_ToolTip.png" width="399" height="349" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now let’s see how this works.&amp;nbsp; The data source is a collection of my Numbers class, which is defined as:&lt;/p&gt;&lt;p&gt;public class Numbers : INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double _number1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double _number2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double _number3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string _number1ChangeReason;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string _number2ChangeReason;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string _number3ChangeReason;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Numbers(double number1, double number2, double number3)&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; _number1 = number1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _number2 = number2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _number3 = number3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public double Number1&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 _number1; }&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 (_number1 == 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;&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; _number1 = 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; this.OnPropertyChanged(&amp;quot;Number1&amp;quot;);&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 (this.Number1ChangeReason == 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; this.Number1ChangeReason = String.Empty;&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; public string Number1ChangeReason&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 _number1ChangeReason; }&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 (_number1ChangeReason == 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;&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; _number1ChangeReason = 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; this.OnPropertyChanged(&amp;quot;Number1ChangeReason&amp;quot;);&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; // All other NumberX and NumberXChangeReason &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // properties were omitted for clarity.&lt;br /&gt;&amp;nbsp; &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 prop)&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(prop));&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;Notice how each Number&lt;i&gt;X&lt;/i&gt; property has a corresponding Number&lt;i&gt;X&lt;/i&gt;ChangeReason property.&amp;nbsp; When the user types an explanation for why they edited a numeric value, they are putting a value into one of those properties.&amp;nbsp; The editor for the “Change Reason” value is called ChangeReasonEditControl.&amp;nbsp; Its XAML file contains this:&lt;/p&gt;&lt;p&gt;&amp;lt;UserControl &lt;br /&gt;&amp;nbsp; x:Class=&amp;quot;XamDataGridAdorningEditor.ChangeReasonEditControl&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;br /&gt;&amp;nbsp; Background=&amp;quot;Transparent&amp;quot;&lt;br /&gt;&amp;nbsp; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Border &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Background=&amp;quot;WhiteSmoke&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BorderBrush=&amp;quot;LightGray&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BorderThickness=&amp;quot;0.5&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CornerRadius=&amp;quot;4&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Border.BitmapEffect&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DropShadowBitmapEffect /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Border.BitmapEffect&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;GroupBox&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BorderBrush=&amp;quot;Transparent&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FontWeight=&amp;quot;Bold&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Header=&amp;quot;Change Reason&amp;quot;&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;TextBox &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:FieldModifier=&amp;quot;private&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:Name=&amp;quot;textBox&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FontWeight=&amp;quot;Normal&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxLines=&amp;quot;10&amp;quot;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Text=&amp;quot;{Binding Path=ChangeReason, UpdateSourceTrigger=PropertyChanged}&amp;quot;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TextWrapping=&amp;quot;Wrap&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Width=&amp;quot;100&amp;quot; Height=&amp;quot;80&amp;quot; &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;lt;/GroupBox&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Border&amp;gt;&lt;br /&gt;&amp;lt;/UserControl&amp;gt;&lt;/p&gt;&lt;p&gt;In order to make that control appear directly beneath a modified cell in the XamDataGrid, I use my trusty UIElementAdorner class to inject it into the adorner layer.&amp;nbsp; I won’t show that class here, because it is a good amount of code, but you can see it if you download &lt;a href="http://users.infragistics.com/joshs/XamDataGridAdorningEditor.zip"&gt;the demo project&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Look at the Text property binding on the TextBox in the ChangeReasonEditControl.&amp;nbsp; Notice how it is bound to a property named ChangeReason.&amp;nbsp; The Numbers class does not have a property called ChangeReason.&amp;nbsp; In order to allow ChangeReasonEditControl to bind to any of the Number&lt;i&gt;X&lt;/i&gt;ChangeReason properties, I had to create a proxy class.&amp;nbsp; That class is a private nested class within the main Window, defined as:&lt;/p&gt;private class ChangeReasonProxy&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; readonly Numbers _numbers;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; readonly PropertyDescriptor _changeReasonPropDesc;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ChangeReasonProxy(Numbers numbers, string changeReasonPropName)&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; _numbers = numbers;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _changeReasonPropDesc = TypeDescriptor.GetProperties(numbers)[changeReasonPropName];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string ChangeReason&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 _changeReasonPropDesc.GetValue(_numbers) as string; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _changeReasonPropDesc.SetValue(_numbers, value); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;p&gt;When the adorning editor is displayed, its DataContext is set to an instance of that proxy class.&amp;nbsp; Here’s the code that handles this task:&lt;/p&gt;&lt;p&gt;void CreateProxyForAdorner()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_adorner == null || this.xamDG.ActiveCell == 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; Numbers numbers = this.xamDG.ActiveCell.Record.DataItem as Numbers;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string changeReasonPropertyName = this.xamDG.ActiveCell.Field.Name + &amp;quot;ChangeReason&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _adorner.DataContext = new ChangeReasonProxy(numbers, changeReasonPropertyName);&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;I won’t burden this blog post with all of the code involved, but the final thing to take note of is the Style applied to each Field’s editor.&amp;nbsp; Those Styles apply the tooltip and background color after the user has edited a cell in a Field.&amp;nbsp; Here is the declaration of the first Field in the grid:&lt;/p&gt;&lt;p&gt;&amp;lt;igDP:Field Name=&amp;quot;Number1&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;igDP:Field.Settings&amp;gt;&lt;br /&gt;&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:FieldSettings.EditorStyle&amp;gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style TargetType=&amp;quot;{x:Type igEditors:XamNumericEditor}&amp;quot;&amp;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;lt;Setter Property=&amp;quot;ToolTip&amp;quot; Value=&amp;quot;{Binding Path=DataItem.Number1ChangeReason}&amp;quot; /&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;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;{StaticResource ModifiedCellBackBrush}&amp;quot; /&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;Style.Triggers&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;DataTrigger &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; Binding=&amp;quot;{Binding Path=DataItem.Number1ChangeReason}&amp;quot; &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; Value=&amp;quot;{x:Null}&amp;quot;&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;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=&amp;quot;Background&amp;quot; Value=&amp;quot;Transparent&amp;quot; /&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;/DataTrigger&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;/Style.Triggers&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldSettings.EditorStyle&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldSettings&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/igDP:Field.Settings&amp;gt;&lt;br /&gt;&amp;lt;/igDP:Field&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Download the demo project &lt;a href="http://users.infragistics.com/joshs/XamDataGridAdorningEditor.zip"&gt;here&lt;/a&gt;.&amp;nbsp; This project was built in Visual Studio 2008 using NetAdvantage for WPF v8.1.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77400" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author><category term="wpf" scheme="http://www.infragistics.com/community/blogs/josh_smith/archive/tags/wpf/default.aspx" /></entry><entry><title>Emulating the IsSynchronizedWithCurrentItem Behavior in XamDataGrid</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/09/09/emulating-the-issynchronizedwithcurrentitem-behavior-in-xamdatagrid.aspx" /><id>/community/blogs/josh_smith/archive/2008/09/09/emulating-the-issynchronizedwithcurrentitem-behavior-in-xamdatagrid.aspx</id><published>2008-09-09T19:38:00Z</published><updated>2008-09-09T19:38:00Z</updated><content type="html">&lt;p&gt;In WPF programming, you often set a list control’s IsSynchronizedWithCurrentItem property to true so that selecting an item in the list will cause the rest of the UI to treat that item as the “current” item to display.&amp;nbsp; In addition, by setting that property to true, if some other control (or line of code) decides to set the current item to a new value, the list control will automatically select that item.&amp;nbsp; This is based on the CurrentItem property of WPF’s built-in ICollectionView interface.&amp;nbsp; You can learn more about this feature of WPF in my MSDN article, ‘&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc700358.aspx#id0190053" target="_blank"&gt;Customizing Data Display with Data Binding and WPF&lt;/a&gt;’.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;XamDataGrid does not yet have a property similar to IsSynchronizedWithCurrentItem.&amp;nbsp; In this blog post, I provide a class that will emulate that functionality.&amp;nbsp; Once the control has native support for this functionality, my stopgap solution will be unnecessary. &lt;/p&gt;&lt;p&gt;I decided to expose this functionality as an &lt;a href="http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx" title="Article about attached behaviors" target="_blank"&gt;attached behavior&lt;/a&gt;, so that it is easy to use it from XAML. The XAML below demonstrates how to use the feature:&lt;br /&gt;&amp;lt;!-- &lt;br /&gt;NOTE: The XamDataGrid&amp;#39;s DataContext *must* reference the data source, &lt;br /&gt;otherwise the current item sync behavior will not work.&amp;nbsp; In this demo,&lt;br /&gt;the DataContext is inherited from the Window, and the DataSource property&lt;br /&gt;is bound directly to the DataContext.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;igDP:XamDataGrid &lt;br /&gt;&amp;nbsp; DataSource=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;&lt;b&gt;&amp;nbsp; local:XamDataGridBehavior.IsSynchronizedWithCurrentItem=&amp;quot;True&amp;quot;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; /&amp;gt;&lt;/p&gt;&lt;p&gt;When you run the demo app, you will see a XamDataGrid and a ListBox, both bound to the same data source.&amp;nbsp; In the screenshot below, I’ve select an item in one control and it is, due to the magic of ICollectionView, selected in the other control. &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/XamDataGrid_SyncWithCurrentItem_Screenshot1.png" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In the next screenshot, you can see that I deleted the item with the name ‘David’ from one control, and it is removed from both (because they are both bound to the same data source).&amp;nbsp; Also, notice that both controls now have the item with the name ‘Paco’ selected.&amp;nbsp; All of this happens automatically, since both controls rely on WPF&amp;#39;s built-in support for currency management.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/XamDataGrid_SyncWithCurrentItem_Screenshot2.png" width="399" height="599" alt="" /&gt;&lt;/p&gt;&lt;p&gt;I must point out some limitations.&amp;nbsp; It only works properly if the XamDataGrid is showing flat data.&amp;nbsp; If your data source is hierarchical, when you select a child record, the rest of the UI will not recognize the new current item, because it is not in the collection of items to which they are bound.&amp;nbsp; Also, ICollectionView does not support having multiple current items, which means you cannot have multiple selected records in the XamDataGrid that correspond to multiple selected items elsewhere in the UI.&amp;nbsp; That is a limitation imposed by WPF, not the grid control or my implementation.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Download&lt;/b&gt; the source code &lt;a href="http://users.infragistics.com/joshs/XamDataGridCurrentItemSync.zip"&gt;here&lt;/a&gt;.&amp;nbsp; The project compiles in Visual Studio 2008 using NetAdvantage for WPF v8.1.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77390" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author><category term="wpf" scheme="http://www.infragistics.com/community/blogs/josh_smith/archive/tags/wpf/default.aspx" /></entry><entry><title>Display Multiple Icons in a XamDataGrid Field</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/09/06/display-multiple-icons-in-a-xamdatagrid-field.aspx" /><id>/community/blogs/josh_smith/archive/2008/09/06/display-multiple-icons-in-a-xamdatagrid-field.aspx</id><published>2008-09-06T19:32:00Z</published><updated>2008-09-06T19:32:00Z</updated><content type="html">&lt;p&gt;This blog post demonstrates how to, optionally, display multiple icons/images/indicators in an UnboundField of the XamDataGrid.&amp;nbsp; This is a common use case of a data grid control, where one column displays multiple status values.&amp;nbsp; In this example, we have a single column that indicates whether each person displayed in the data grid is an employee and/or customer of some company.&amp;nbsp; When you run the demo program, it looks like this:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;img src="http://users.infragistics.com/joshs/XamDataGrid_MultiIconField_Screenshot.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Download the demo project &lt;a href="http://users.infragistics.com/joshs/XamDataGridMultiIconField.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The data source in this simple demo is an array of Person objects, where the Person class is defined as:&lt;/p&gt;&lt;p&gt;public class Person&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Person(string firstName, string lastName, bool isEmployee, bool isCustomer)&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.FirstName = firstName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.LastName = lastName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.IsCustomer = isCustomer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.IsEmployee = isEmployee;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string FirstName { get; private set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string LastName { get; private set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool IsEmployee { get; private set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool IsCustomer { get; private set; }&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;The values of the two Boolean properties are displayed in the same field, as seen above.&amp;nbsp; That field is declared as an UnboundField object, because it is not bound to a single, specific property on the data source objects.&amp;nbsp; Now let’s see how that UnboundField is configured such that it conditionally displays the two indicators that tell the user if a person is an employee and/or customer.&lt;/p&gt;&lt;p&gt;&amp;lt;!-- &lt;br /&gt;This unbound field contains icons that indicate if the person &lt;br /&gt;represented by a record is an Employee and/or Customer.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;igDP:UnboundField Label=&amp;quot; E / C&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;igDP:UnboundField.Settings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:FieldSettings&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AllowEdit=&amp;quot;False&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AllowGroupBy=&amp;quot;False&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AllowResize=&amp;quot;False&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AllowSummaries=&amp;quot;False&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LabelClickAction=&amp;quot;Nothing&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LabelMaxWidth=&amp;quot;45&amp;quot; CellMaxWidth=&amp;quot;45&amp;quot;&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:FieldSettings.CellValuePresenterStyle&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style TargetType=&amp;quot;{x:Type igDP:CellValuePresenter}&amp;quot;&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;Setter Property=&amp;quot;Template&amp;quot;&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;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ControlTemplate TargetType=&amp;quot;{x:Type igDP:CellValuePresenter}&amp;quot;&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;DockPanel&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;!-- Give the left edge of the cell a vertical line. --&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;Border&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; DockPanel.Dock=&amp;quot;Left&amp;quot;&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; BorderBrush=&amp;quot;#FFEEEEEE&amp;quot; &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; BorderThickness=&amp;quot;1,0,0,0&amp;quot; &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;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;StackPanel Orientation=&amp;quot;Horizontal&amp;quot; HorizontalAlignment=&amp;quot;Center&amp;quot;&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;Grid x:Name=&amp;quot;EmployeeIcon&amp;quot; ToolTip=&amp;quot;Employee&amp;quot;&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;nbsp;&amp;nbsp; &amp;lt;!-- Drop shadow behind icon --&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;nbsp;&amp;nbsp; &amp;lt;Ellipse &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; Fill=&amp;quot;#FF444444&amp;quot;&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; Margin=&amp;quot;1,0.5,0,0&amp;quot;&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; Width=&amp;quot;12&amp;quot; Height=&amp;quot;12&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Employee icon --&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;nbsp;&amp;nbsp; &amp;lt;Ellipse&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; Fill=&amp;quot;LawnGreen&amp;quot;&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; Width=&amp;quot;12&amp;quot; Height=&amp;quot;12&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;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;/Grid&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;Grid x:Name=&amp;quot;CustomerIcon&amp;quot; Margin=&amp;quot;6,0,0,0&amp;quot; ToolTip=&amp;quot;Customer&amp;quot;&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;nbsp;&amp;nbsp; &amp;lt;!-- Drop shadow behind icon --&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;nbsp;&amp;nbsp; &amp;lt;Ellipse &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; Fill=&amp;quot;#FF444444&amp;quot;&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; Margin=&amp;quot;1,0.5,0,0&amp;quot;&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; Width=&amp;quot;12&amp;quot; Height=&amp;quot;12&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Customer icon --&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;nbsp;&amp;nbsp; &amp;lt;Ellipse&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; Fill=&amp;quot;Orange&amp;quot;&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; Width=&amp;quot;12&amp;quot; Height=&amp;quot;12&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;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;/Grid&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;/StackPanel&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;/DockPanel&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;!-- These triggers hide the icons that do not apply to a person. --&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;&lt;b&gt; &amp;lt;ControlTemplate.Triggers&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;DataTrigger Binding=&amp;quot;{Binding Path=DataItem.IsEmployee}&amp;quot; Value=&amp;quot;False&amp;quot;&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;Setter TargetName=&amp;quot;EmployeeIcon&amp;quot; Property=&amp;quot;Visibility&amp;quot; Value=&amp;quot;Hidden&amp;quot; /&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;/DataTrigger&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;DataTrigger Binding=&amp;quot;{Binding Path=DataItem.IsCustomer}&amp;quot; Value=&amp;quot;False&amp;quot;&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;Setter TargetName=&amp;quot;CustomerIcon&amp;quot; Property=&amp;quot;Visibility&amp;quot; Value=&amp;quot;Hidden&amp;quot; /&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;/DataTrigger&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;/ControlTemplate.Triggers&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;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;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;/Setter&amp;gt;&lt;br /&gt;&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;lt;/igDP:FieldSettings.CellValuePresenterStyle&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/igDP:FieldSettings&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/igDP:UnboundField.Settings&amp;gt;&lt;br /&gt;&amp;lt;/igDP:UnboundField&amp;gt;&lt;/p&gt;&lt;p&gt;That XAML is rather verbose, because I wanted to add a subtle drop shadow effect to each indicator, but without using the DropShadowBitmapEffect (which is not hardware-accelerated unless running on .NET 3.5 SP1 or later).&amp;nbsp; The template’s triggers are responsible for hiding the indicators that do not apply to a person.&lt;/p&gt;&lt;p&gt;This project was built against NetAdvantage for WPF v8.1 using Visual Studio 2008.&amp;nbsp; You can download the source code &lt;a href="http://users.infragistics.com/joshs/XamDataGridMultiIconField.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77384" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author><category term="wpf" scheme="http://www.infragistics.com/community/blogs/josh_smith/archive/tags/wpf/default.aspx" /></entry><entry><title>Adding CheckBoxes to the Record Selectors in XamDataGrid</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/09/04/adding-checkboxes-to-the-record-selectors-in-xamdatagrid.aspx" /><id>/community/blogs/josh_smith/archive/2008/09/04/adding-checkboxes-to-the-record-selectors-in-xamdatagrid.aspx</id><published>2008-09-04T16:44:00Z</published><updated>2008-09-04T16:44:00Z</updated><content type="html">





&lt;p&gt;This blog post explains how to add CheckBox controls to the
record selectors in XamDataGrid.&amp;nbsp; We will
also see how to add a CheckBox to the header area above the record selectors,
so that you can have Check All / Uncheck All behavior.&amp;nbsp; &amp;nbsp;You
can download the demo application &lt;a href="http://users.infragistics.com/joshs/XamDataGridWithCheckedRecords.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;The screenshot below shows the demo application in action:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://users.infragistics.com/joshs/XamDataGridWithCheckedRecords_Screenshot.png" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;If you were to check Ned&amp;#39;s CheckBox, all of the records
would be in the checked state, so the header CheckBox would automatically enter
the checked state.&amp;nbsp; If you toggle the
state of the header CheckBox, all of the other CheckBoxes beneath it would
assume that new check state.&amp;nbsp; If you
click the button on the bottom, a MessageBox would show you which items are
checked and unchecked.&lt;/p&gt;

&lt;p&gt;In my demo app, the data objects are of type Person, as seen
below:&lt;/p&gt;
/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// A simple data object that stores &lt;br /&gt;/// information about a person.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class Person&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static Person[] GetPeople()&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; return 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(&amp;quot;Jane&amp;quot;, 23),&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(&amp;quot;Mike&amp;quot;, 45),&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(&amp;quot;Ned&amp;quot;, 67),&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; public Person(string name, int age)&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.Name = name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Age = age;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Age { get; private set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get; private set; }&lt;br /&gt;}&lt;br /&gt;
&lt;p&gt;Notice that the Person class does not have any notion of
being &amp;quot;checked.&amp;quot;&amp;nbsp; This makes sense,
because a person in the real world is not checked or unchecked.&amp;nbsp; In order to extend the semantics of a person,
and make changes to a person observable to other objects, I created a PersonViewModel
class.&amp;nbsp; That class is below:&lt;/p&gt;

&lt;p&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// A presentation-friendly wrapper for the Person&lt;br /&gt;/// class, which has support for being &amp;#39;checked.&amp;#39;&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class PersonViewModel : INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; readonly Person _person;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool _isChecked;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PersonViewModel(Person person)&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 = person;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool IsChecked&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 _isChecked; }&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 == _isChecked)&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; _isChecked = 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(&amp;quot;IsChecked&amp;quot;);&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; public int Age { get { return _person.Age; } }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get { return _person.Name; } }&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 prop)&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(prop));&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;br /&gt;&lt;/p&gt;

&lt;p&gt;The XamDataGrid displays a list of PersonViewModel
objects.&amp;nbsp; The DataItem property of each
DataRecord in the grid references a PersonViewModel.&amp;nbsp; The following Style exists in the XamDataGrid&amp;#39;s
Resources collection, applying a CheckBox to the record selector of each row.&lt;/p&gt;
&amp;lt;Style TargetType=&amp;quot;{x:Type igDP:RecordSelector}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Setter Property=&amp;quot;Template&amp;quot;&amp;gt;&lt;br /&gt;&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;ControlTemplate TargetType=&amp;quot;{x:Type igDP:RecordSelector}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp; HorizontalAlignment=&amp;quot;Center&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VerticalAlignment=&amp;quot;Center&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;IsChecked=&amp;quot;{Binding Path=DataItem.IsChecked}&amp;quot;&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;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/CheckBox&amp;gt;&lt;br /&gt;&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;lt;/Setter.Value&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Setter&amp;gt;&lt;br /&gt;&amp;lt;/Style&amp;gt;&lt;br /&gt;
&lt;p&gt;The collection of PersonViewModel objects to which the XamDataGrid
is bound exists in an instance of my CommunityViewModel class.&amp;nbsp; That class serves two purposes.&amp;nbsp; First, it contains the list of
PersonViewModel objects in its Members property.&amp;nbsp; Second, it provides a get/set property called
AllMembersAreChecked.&amp;nbsp; This property is
used to maintain the state of the CheckBox in the header area above the record
selectors, and to update the IsChecked property of all PersonViewModel objects
when the property is set.&amp;nbsp; Here is the
CommunityViewModel class:&lt;/p&gt;
public class CommunityViewModel : INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CommunityViewModel(List&amp;lt;PersonViewModel&amp;gt; members)&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.Members = members;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (PersonViewModel member in members)&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; member.PropertyChanged += delegate&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; this.OnPropertyChanged(&amp;quot;AllMembersAreChecked&amp;quot;);&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; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;PersonViewModel&amp;gt; Members { get; private set; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool? AllMembersAreChecked&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&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; bool? value = 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; for (int idx = 0; idx &amp;lt; this.Members.Count; ++idx)&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 (idx == 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; {&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; value = this.Members[0].IsChecked;&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; }&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; else if (value != this.Members[idx].IsChecked)&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; {&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; value = 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&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; }&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 value;&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; 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 == 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; 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; foreach (PersonViewModel member in this.Members)&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; member.IsChecked = value.Value;&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 prop)&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(prop));&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;br /&gt;
&lt;p&gt;The Style used to apply a CheckBox to the header area is
quite similar to the one we saw previously.&amp;nbsp;
One difference is that this Style explicitly sets the target element&amp;#39;s
Visibility property to ‘Visible&amp;#39;, otherwise we would never see the
CheckBox.&amp;nbsp; That Style is below:&lt;/p&gt;
&amp;lt;Style TargetType=&amp;quot;{x:Type igDP:HeaderPrefixArea}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &lt;b&gt;&amp;lt;Setter Property=&amp;quot;Visibility&amp;quot; Value=&amp;quot;Visible&amp;quot; /&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;Setter Property=&amp;quot;Template&amp;quot;&amp;gt;&lt;br /&gt;&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;ControlTemplate TargetType=&amp;quot;{x:Type igDP:HeaderPrefixArea}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp; HorizontalAlignment=&amp;quot;Center&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VerticalAlignment=&amp;quot;Center&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;IsChecked=&amp;quot;{Binding Path=DataPresenter.DataContext.AllMembersAreChecked}&amp;quot;&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;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/CheckBox&amp;gt;&lt;br /&gt;&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;lt;/Setter.Value&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/Setter&amp;gt;&lt;br /&gt;&amp;lt;/Style&amp;gt;&lt;br /&gt;
&lt;p&gt;Download the demo project &lt;a href="http://users.infragistics.com/joshs/XamDataGridWithCheckedRecords.zip"&gt;here&lt;/a&gt;.&amp;nbsp; The demo was built in Visual Studio 2008, using NetAdvantage for WPF v8.1.&lt;br /&gt;&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77372" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author><category term="wpf" scheme="http://www.infragistics.com/community/blogs/josh_smith/archive/tags/wpf/default.aspx" /></entry><entry><title>Article about xamSalesManager</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/07/25/article-about-xamsalesmanager.aspx" /><id>/community/blogs/josh_smith/archive/2008/07/25/article-about-xamsalesmanager.aspx</id><published>2008-07-25T16:35:00Z</published><updated>2008-07-25T16:35:00Z</updated><content type="html">&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" alt="" /&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;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77369" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author></entry><entry><title>Synchronizing Field Widths between FieldLayouts in XamDataGrid</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/07/02/synchronizing-field-widths-between-fieldlayouts-in-xamdatagrid.aspx" /><id>/community/blogs/josh_smith/archive/2008/07/02/synchronizing-field-widths-between-fieldlayouts-in-xamdatagrid.aspx</id><published>2008-07-03T00:55:00Z</published><updated>2008-07-03T00:55:00Z</updated><content type="html">&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&amp;#39;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" alt="" /&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&amp;#39;s examine the XAML in the demo application&amp;#39;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=&amp;quot;xamDataGrid&amp;quot;&lt;br /&gt;&amp;nbsp; DataSource=&amp;quot;{Binding}&amp;quot;&lt;br /&gt;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;FieldLayoutInitialized=&amp;quot;xamDataGrid_FieldLayoutInitialized&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; GroupByAreaLocation=&amp;quot;None&amp;quot;&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=&amp;quot;{x:Type igDP:LabelPresenter}&amp;quot;&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=&amp;quot;SizeChanged&amp;quot; &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=&amp;quot;OnLabelPresenterSizeChanged&amp;quot; &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=&amp;quot;GetData&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectType=&amp;quot;{x:Type local:DataSource}&amp;quot; &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=&amp;quot;master&amp;quot;&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=&amp;quot;ID&amp;quot; Visibility=&amp;quot;Collapsed&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;Name&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;Description&amp;quot;&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=&amp;quot;260&amp;quot; CellWidth=&amp;quot;260&amp;quot; /&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=&amp;quot;{x:Type igDP:CellValuePresenter}&amp;quot;&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=&amp;quot;FontWeight&amp;quot; Value=&amp;quot;Bold&amp;quot; /&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=&amp;quot;detail&amp;quot;&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=&amp;quot;ParentID&amp;quot; Visibility=&amp;quot;Collapsed&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;Name&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;Description&amp;quot; /&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=&amp;quot;False&amp;quot; LabelMaxHeight=&amp;quot;0&amp;quot;&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=&amp;quot;{x:Type igDP:CellValuePresenter}&amp;quot;&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=&amp;quot;Margin&amp;quot; Value=&amp;quot;-3,0,0,0&amp;quot; /&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=&amp;quot;{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}&amp;quot; &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=&amp;quot;True&amp;quot;&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=&amp;quot;Margin&amp;quot; Value=&amp;quot;-3,0,0,0&amp;quot; /&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=&amp;quot;{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}&amp;quot; &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=&amp;quot;True&amp;quot;&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=&amp;quot;Margin&amp;quot; Value=&amp;quot;-3,0,0,0&amp;quot; /&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=&amp;quot;True&amp;quot; /&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=&amp;quot;False&amp;quot; CellClickAction=&amp;quot;SelectRecord&amp;quot; /&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&amp;#39;s Resources collection has a
typed Style that targets LabelPresenter.&amp;nbsp;
That Style adds a handler to a LabelPresenter&amp;#39;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&amp;#39;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&amp;#39;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(&amp;quot;LabelWidthResolved&amp;quot;),&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;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77361" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author></entry><entry><title>Data Binding the IsVisible Property of ContextualTabGroup</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/06/26/data-binding-the-isvisible-property-of-contextualtabgroup.aspx" /><id>/community/blogs/josh_smith/archive/2008/06/26/data-binding-the-isvisible-property-of-contextualtabgroup.aspx</id><published>2008-06-27T00:47:00Z</published><updated>2008-06-27T00:47:00Z</updated><content type="html">&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" alt="" /&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://community.beta.infragistics.local/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" alt="" /&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" alt="" /&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(&amp;quot;ShowContextualTabGroup&amp;quot;);&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=&amp;quot;Bottom&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Content=&amp;quot;Show ContextualTabGroup&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;IsChecked=&amp;quot;{Binding Path=ShowContextualTabGroup}&amp;quot;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Margin=&amp;quot;10&amp;quot;&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=&amp;quot;Top&amp;quot;&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=&amp;quot;spy&amp;quot; /&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=&amp;quot;I am a ContextualTabGroup&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;IsVisible=&amp;quot;{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}&amp;quot;&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=&amp;quot;I am a RibbonTabItem in the ContextualTabGroup&amp;quot; &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;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77359" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author></entry><entry><title>Persisting XamDataGrid Field Widths between Runs of an Application</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/06/20/persisting-xamdatagrid-field-widths-between-runs-of-an-application.aspx" /><id>/community/blogs/josh_smith/archive/2008/06/20/persisting-xamdatagrid-field-widths-between-runs-of-an-application.aspx</id><published>2008-06-20T17:47:00Z</published><updated>2008-06-20T17:47:00Z</updated><content type="html">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" alt="" /&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=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;field-layouts&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;field-layout id=&amp;quot;master&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name=&amp;quot;ID&amp;quot; width=&amp;quot;52&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name=&amp;quot;Column 1&amp;quot; width=&amp;quot;77&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name=&amp;quot;Column 2&amp;quot; width=&amp;quot;71&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name=&amp;quot;Column 3&amp;quot; width=&amp;quot;148&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name=&amp;quot;Column 4&amp;quot; width=&amp;quot;168&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/field-layout&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;field-layout id=&amp;quot;detail&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name=&amp;quot;ParentID&amp;quot; width=&amp;quot;258&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field name=&amp;quot;Whatever&amp;quot; width=&amp;quot;190&amp;quot; /&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 = &amp;quot;field-widths.xml&amp;quot;;&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 = &amp;quot;master&amp;quot;;&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 = &amp;quot;detail&amp;quot;;&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&amp;#39;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;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77353" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author></entry><entry><title>Putting a CheckBox in the cells of an UnboundField of XamDataGrid</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/06/16/putting-a-checkbox-in-the-cells-of-an-unboundfield-of-xamdatagrid.aspx" /><id>/community/blogs/josh_smith/archive/2008/06/16/putting-a-checkbox-in-the-cells-of-an-unboundfield-of-xamdatagrid.aspx</id><published>2008-06-17T02:36:00Z</published><updated>2008-06-17T02:36:00Z</updated><content type="html">&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" alt="" /&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=&amp;quot;0&amp;quot; &lt;br /&gt;&amp;nbsp; AutoFit=&amp;quot;True&amp;quot;&lt;br /&gt;&amp;nbsp; DataSource=&amp;quot;{Binding}&amp;quot; &lt;br /&gt;&amp;nbsp; &lt;span style="font-weight:bold;"&gt;InitializeRecord=&amp;quot;XamDataGrid_InitializeRecord&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; Theme=&amp;quot;Office2k7Black&amp;quot;&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=&amp;quot;local:Commands.ShowInChart&amp;quot;&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=&amp;quot;ShowInChart_CanExecute&amp;quot;&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=&amp;quot;ShowInChart_Executed&amp;quot;&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=&amp;quot;ShowInChartCellStyle&amp;quot;&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TargetType=&amp;quot;{x:Type igDP:CellValuePresenter}&amp;quot;&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=&amp;quot;Template&amp;quot;&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=&amp;quot;{x:Type igDP:CellValuePresenter}&amp;quot;&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=&amp;quot;local:Commands.ShowInChart&amp;quot;&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=&amp;quot;{Binding Path=DataItem}&amp;quot;&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=&amp;quot;Center&amp;quot; &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=&amp;quot;{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}&amp;quot;&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=&amp;quot;Center&amp;quot;&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=&amp;quot;TotalSalesEditorStyle&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TargetType=&amp;quot;{x:Type igEditors:ValueEditor}&amp;quot;&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=&amp;quot;Format&amp;quot; Value=&amp;quot;c&amp;quot; /&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=&amp;quot;ShowInChart&amp;quot; Label=&amp;quot;Compare&amp;quot;&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=&amp;quot;70&amp;quot; LabelMaxWidth=&amp;quot;70&amp;quot; &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=&amp;quot;{StaticResource ShowInChartCellStyle}&amp;quot;&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=&amp;quot;ID&amp;quot;&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=&amp;quot;40&amp;quot; &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=&amp;quot;40&amp;quot; &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=&amp;quot;Name&amp;quot; Label=&amp;quot;Customer Name&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;igDP:Field Name=&amp;quot;TotalSales&amp;quot; Label=&amp;quot;Total Sales&amp;quot;&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=&amp;quot;{StaticResource TotalSalesEditorStyle}&amp;quot; &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[&amp;quot;ShowInChart&amp;quot;].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 = &amp;quot;Cust #&amp;quot; + 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; &amp;quot;Name: {0} {1} Total Sales: {2}&amp;quot;,&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(&amp;quot;c&amp;quot;));&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;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77339" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author></entry><entry><title>Binding a XamDataGrid Field Property</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/06/06/binding-a-xamdatagrid-field-property.aspx" /><id>/community/blogs/josh_smith/archive/2008/06/06/binding-a-xamdatagrid-field-property.aspx</id><published>2008-06-06T05:53:00Z</published><updated>2008-06-06T05:53:00Z</updated><content type="html">&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&amp;#39;t be an issue, but for now there is no clean way to bind a Field&amp;#39;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&amp;#39;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" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you then click the &amp;quot;Show Photos&amp;quot; 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" alt="" /&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(&amp;quot;Boss Hogg&amp;quot;, 42, &amp;quot;hogg.jpg&amp;quot;),&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(&amp;quot;Johann Bach&amp;quot;, 50, &amp;quot;bach.jpg&amp;quot;),&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(&amp;quot;Mugatu&amp;quot;, 39, &amp;quot;mugatu.gif&amp;quot;),&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(&amp;quot;Simon Wolcott&amp;quot;, 24, &amp;quot;wolcott.jpg&amp;quot;)&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(&amp;quot;DATA_CommunityViewModel&amp;quot;, 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&amp;#39;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&amp;#39;s Resources so that the Field&amp;#39;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(&amp;quot;ShowPhotos&amp;quot;);&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 &amp;#39;Photo&amp;#39; Field declaration:&lt;/p&gt;&lt;p&gt;&amp;lt;Window &lt;br /&gt;&amp;nbsp; x:Class=&amp;quot;XamDataGridWithBoundField.Window1&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;br /&gt;&amp;nbsp; xmlns:igDP=&amp;quot;http://infragistics.com/DataPresenter&amp;quot;&lt;br /&gt;&amp;nbsp; Title=&amp;quot;Window1&amp;quot; &lt;br /&gt;&amp;nbsp; Width=&amp;quot;400&amp;quot; Height=&amp;quot;400&amp;quot; &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=&amp;quot;PhotoCellStyle&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TargetType=&amp;quot;{x:Type igDP:CellValuePresenter}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property=&amp;quot;Template&amp;quot;&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=&amp;quot;{x:Type igDP:CellValuePresenter}&amp;quot;&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=&amp;quot;{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}&amp;quot; &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=&amp;quot;60&amp;quot; Height=&amp;quot;60&amp;quot;&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=&amp;quot;Top&amp;quot;&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=&amp;quot;Show Photos&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IsChecked=&amp;quot;{Binding Path=ShowPhotos}&amp;quot; &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=&amp;quot;True&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataSource=&amp;quot;{Binding Constituents}&amp;quot;&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=&amp;quot;Name&amp;quot; Name=&amp;quot;Name&amp;quot; /&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=&amp;quot;Photo&amp;quot; Name=&amp;quot;ImageUri&amp;quot;&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=&amp;quot;70&amp;quot; LabelMaxWidth=&amp;quot;70&amp;quot;&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=&amp;quot;{StaticResource PhotoCellStyle}&amp;quot;&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=&amp;quot;ShowPhotos&amp;quot;&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=&amp;quot;{StaticResource DATA_CommunityViewModel}&amp;quot;&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=&amp;quot;Age&amp;quot; Name=&amp;quot;Age&amp;quot; /&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;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77328" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author></entry><entry><title>Using a ViewModel to harness the power of the WPF TreeView</title><link rel="alternate" type="text/html" href="/community/blogs/josh_smith/archive/2008/05/23/using-a-viewmodel-to-harness-the-power-of-the-wpf-treeview.aspx" /><id>/community/blogs/josh_smith/archive/2008/05/23/using-a-viewmodel-to-harness-the-power-of-the-wpf-treeview.aspx</id><published>2008-05-23T17:33:00Z</published><updated>2008-05-23T17:33:00Z</updated><content type="html">&lt;p&gt;Microsoft&amp;#39;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&amp;#39;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&amp;#39;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&amp;#39;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;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.infragistics.com/community/aggbug.aspx?PostID=77327" width="1" height="1"&gt;</content><author><name>joshsmith</name><uri>http://www.infragistics.com/profile/Mjk1OA==</uri></author></entry></feed>