<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6150253848868465050</id><updated>2011-10-12T08:27:34.629-07:00</updated><category term='WPF Reactive Rx'/><category term='LINQ'/><category term='WPF Memory Leaks'/><category term='C# Parallel Programming'/><category term='WPF Drop Down Button'/><category term='C# Extension'/><category term='IEnumerable'/><category term='WPF Sliding Adorner'/><category term='WPF Accordion Menu'/><category term='XML'/><category term='WPF IntegerText Box'/><category term='WPF Split Button'/><category term='WPF Expanding Menu'/><category term='WPF Drag Drop'/><category term='WPF Fisheye Control'/><category term='WPF CurrencyText Box'/><category term='WPF Progress Bar'/><category term='WPF List View'/><category term='WPF NumericText Box'/><category term='WPF Loading Panel'/><category term='WPF Animated Dashboard'/><category term='Custom Attribute'/><category term='WPF Filter Combo Box'/><category term='Rx Text Box TextChanged'/><category term='Regular Expression'/><title type='text'>Huy's Blog</title><subtitle type='html'>Simple programming samples for WPF and C#.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-994707657135917910</id><published>2011-07-21T09:47:00.000-07:00</published><updated>2011-07-21T10:08:52.064-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF Accordion Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF Expanding Menu'/><title type='text'>WPF Expanding Menu</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-wHHTtzKw9h8/TihYUEAo0OI/AAAAAAAAAFM/eGgeJnPlfuU/s1600/ExpandingMenu.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://3.bp.blogspot.com/-wHHTtzKw9h8/TihYUEAo0OI/AAAAAAAAAFM/eGgeJnPlfuU/s400/ExpandingMenu.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5631848435723849954" /&gt;&lt;/a&gt;This is just a nice simple demo using toggle buttons to display an accordion style menu.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/ExpandingMenu.zip"&gt;Expanding Menu&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-994707657135917910?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/994707657135917910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=994707657135917910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/994707657135917910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/994707657135917910'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2011/07/wpf-expanding-menu.html' title='WPF Expanding Menu'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-wHHTtzKw9h8/TihYUEAo0OI/AAAAAAAAAFM/eGgeJnPlfuU/s72-c/ExpandingMenu.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-9113466186477565285</id><published>2011-07-20T21:26:00.001-07:00</published><updated>2011-07-26T11:49:07.122-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF Loading Panel'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF Progress Bar'/><title type='text'>WPF Loading Panel</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-dLhjm4PU6Pc/TifkYJZqerI/AAAAAAAAAFE/Lilrlxz-DuM/s1600/LoadingPanel.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://4.bp.blogspot.com/-dLhjm4PU6Pc/TifkYJZqerI/AAAAAAAAAFE/Lilrlxz-DuM/s400/LoadingPanel.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5631720962541648562" /&gt;&lt;/a&gt;Having a nice loading panel with a progress bar showing that some work is in progress is a very cool feature to any application.&lt;br /&gt;&lt;br /&gt;With this control you can show a loading panel as you are going and fetching data from the database, it will update your window with up to date progress messages.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&amp;lt;ctr:LoadingPanel x:Name=&lt;span class="str"&gt;"loadingPanel"&lt;/span&gt;&lt;br /&gt;                  IsLoading=&lt;span class="str"&gt;"{Binding PanelLoading}"&lt;/span&gt;&lt;br /&gt;                  Message=&lt;span class="str"&gt;"{Binding PanelMainMessage}"&lt;/span&gt;&lt;br /&gt;                  SubMessage=&lt;span class="str"&gt;"{Binding PanelSubMessage}"&lt;/span&gt; &lt;br /&gt;                  ClosePanelCommand=&lt;span class="str"&gt;"{Binding PanelCloseCommand}"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/LoadingPanelSample.zip"&gt;Loading Panel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-9113466186477565285?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/9113466186477565285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=9113466186477565285' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/9113466186477565285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/9113466186477565285'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2011/07/wpf-loading-panel.html' title='WPF Loading Panel'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-dLhjm4PU6Pc/TifkYJZqerI/AAAAAAAAAFE/Lilrlxz-DuM/s72-c/LoadingPanel.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-5267910991002384642</id><published>2010-10-27T07:55:00.000-07:00</published><updated>2010-10-31T06:59:54.639-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF Reactive Rx'/><category scheme='http://www.blogger.com/atom/ns#' term='Rx Text Box TextChanged'/><title type='text'>Rx Lazy Loading Text Box</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_03TyaixMOf0/TMir5raUXMI/AAAAAAAAAEg/2aCvml5D_6E/s1600/Rx.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 392px; height: 400px;" src="http://1.bp.blogspot.com/_03TyaixMOf0/TMir5raUXMI/AAAAAAAAAEg/2aCvml5D_6E/s400/Rx.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5532861149618658498" /&gt;&lt;/a&gt;I started using .Net Reactive (Rx) extensions for work recently. &lt;br /&gt;As a WPF UI developer, one of the nice way of handling a users input is not to do anything until the user have complete his/her action.&lt;br /&gt;&lt;br /&gt;In this example; I have a text box, which will auto filter a data grid when the user stop typing in the text box and the text changed event is fired. &lt;br /&gt;This will improve the UI responsiveness, instead of firing after every key is entered.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// Method OnSearchTextChanged is called .5s after Text Box text changed&lt;/span&gt;&lt;br /&gt;Observable.FromEvent&amp;lt;TextChangedEventArgs&amp;gt;(textbox, &lt;span class="str"&gt;"TextChanged"&lt;/span&gt;)&lt;br /&gt;          .Throttle(TimeSpan.FromSeconds(.5))&lt;br /&gt;          .ObserveOnDispatcher()&lt;br /&gt;          .Subscribe(OnSearchTextChanged);&lt;/pre&gt;&lt;br /&gt;This was only possible in the past throught the use of Timers and Thread.Sleep, Rx makes this easier to do.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/WPFReactive.zip"&gt;Lazy Loading Text Box&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-5267910991002384642?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/5267910991002384642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=5267910991002384642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/5267910991002384642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/5267910991002384642'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2010/10/rx-lazy-loading-text-box.html' title='Rx Lazy Loading Text Box'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_03TyaixMOf0/TMir5raUXMI/AAAAAAAAAEg/2aCvml5D_6E/s72-c/Rx.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-8531768295223144302</id><published>2010-08-15T15:05:00.000-07:00</published><updated>2010-08-16T12:09:53.212-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF NumericText Box'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF CurrencyText Box'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF IntegerText Box'/><title type='text'>WPF Value Type Text Box</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_03TyaixMOf0/TGhuKRxy9oI/AAAAAAAAAD4/4BVwS_D3p4I/s1600/Untitled.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 300px;" src="http://2.bp.blogspot.com/_03TyaixMOf0/TGhuKRxy9oI/AAAAAAAAAD4/4BVwS_D3p4I/s320/Untitled.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5505771667310442114" /&gt;&lt;/a&gt;I wrote a WPF numeric text box control that can support currency, integer and numeric values.&lt;br /&gt;It can prevent invalid input such as letters, spaces, etc. and can be constrained to a max length value.&lt;br /&gt;&lt;br /&gt;For example, with the currency text box; when the text box is in focused the formatting is removed allowing the user to enter the value.&lt;br /&gt;When the text box loses focus, formatting is reapplied and display in the text box.  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/ValueTypeTextBox.zip"&gt;Value Type Text Box&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-8531768295223144302?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/8531768295223144302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=8531768295223144302' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/8531768295223144302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/8531768295223144302'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2010/08/wpf-value-type-text-box.html' title='WPF Value Type Text Box'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_03TyaixMOf0/TGhuKRxy9oI/AAAAAAAAAD4/4BVwS_D3p4I/s72-c/Untitled.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-1445189003881585816</id><published>2010-05-05T15:11:00.000-07:00</published><updated>2010-10-31T06:40:38.825-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Custom Attribute'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF Filter Combo Box'/><title type='text'>WPF Filter Combo Box</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_03TyaixMOf0/S-HtcFIGAQI/AAAAAAAAADo/WaWTDTCWO5A/s1600/ComboBox.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 300px; height: 300px;" src="http://2.bp.blogspot.com/_03TyaixMOf0/S-HtcFIGAQI/AAAAAAAAADo/WaWTDTCWO5A/s320/ComboBox.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5467912489272738050" /&gt;&lt;/a&gt;I was asked to write a prototype for a project that I am currently working on.&lt;br /&gt;They wanted to be able to selected for a master combo box and filter the selection of the sub-child combo boxes.&lt;br /&gt;&lt;br /&gt;I read an article on &lt;a href="http://stackoverflow.com/questions/1947850/wpf-filter-combobox-items-based-on-listview-items"&gt;stackoverflow&lt;/a&gt;, which I base my code sample on.&lt;br /&gt;&lt;br /&gt;To do this Master-Child Hierarchy, I have implemented it through the use of the attribute property, by creating a custom attribute (PriorityLevel).&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Football&lt;br /&gt;{&lt;br /&gt;    [PriorityLevel(1)]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; League League { get; set; }&lt;br /&gt;&lt;br /&gt;    [PriorityLevel(2)]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Team { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;I have created the custom attribute with the use of an interface (IAttribute).&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PriorityLevelAttribute : Attribute, EnumHelper.IAttribute&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; _value;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; PriorityLevelAttribute(&lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        _value = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Value&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _value; }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Another think that I thought would be quite good was to have a strong type attribute for enums. &lt;br /&gt;This extension method will allow you to return a strong type value of your attribute enum value.  &lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Returns the attribute value for a given Enum value.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; TR GetAttributeValue&amp;lt;T, TR&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; Enum &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;    var attributeValue = &lt;span class="kwrd"&gt;default&lt;/span&gt;(TR);&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        var fi = &lt;span class="kwrd"&gt;value&lt;/span&gt;.GetType().GetField(&lt;span class="kwrd"&gt;value&lt;/span&gt;.ToString());&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (fi != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            var attributes = fi.GetCustomAttributes(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T), &lt;span class="kwrd"&gt;false&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; T[];&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (attributes != &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; attributes.Length &amp;gt; 0)&lt;br /&gt;            {&lt;br /&gt;                var attribute = attributes[0] &lt;span class="kwrd"&gt;as&lt;/span&gt; IAttribute&amp;lt;TR&amp;gt;;&lt;br /&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (attribute != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    attributeValue = attribute.Value;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; attributeValue;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Imagine you have a enum class, and you wanted to have addition information to the enum.&lt;br /&gt;This is a elegant way to implement a strong type value for your enum, throught attribute. &lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; League&lt;br /&gt;{&lt;br /&gt;    [DisplayDescription(&lt;span class="str"&gt;"Argentine Primera Division"&lt;/span&gt;)]&lt;br /&gt;    PrimeraDivision = 1,&lt;br /&gt;    &lt;br /&gt;    [DisplayDescription(&lt;span class="str"&gt;"English Premier League"&lt;/span&gt;)]&lt;br /&gt;    PremierLeague = 2,&lt;br /&gt;&lt;br /&gt;    [DisplayDescription(&lt;span class="str"&gt;"Spanish La Liga"&lt;/span&gt;)]&lt;br /&gt;    LaLiga = 3&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DisplayDescriptionAttribute : Attribute, EnumHelper.IAttribute&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _value;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DisplayDescriptionAttribute(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        _value = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Value&lt;br /&gt;    {&lt;br /&gt;        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _value; }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// This is the implementation.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;var displayValue = league.GetAttributeValue&amp;lt;DisplayDescriptionAttribute, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/PriorityFilterComboBox.zip"&gt;Filter Combo Box&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-1445189003881585816?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/1445189003881585816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=1445189003881585816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/1445189003881585816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/1445189003881585816'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2010/05/filter-combo-box.html' title='WPF Filter Combo Box'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_03TyaixMOf0/S-HtcFIGAQI/AAAAAAAAADo/WaWTDTCWO5A/s72-c/ComboBox.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-1368343489630960163</id><published>2010-02-12T16:43:00.001-08:00</published><updated>2010-10-31T06:09:04.847-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>Reading and Writing XML with Linq</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_03TyaixMOf0/S3X6kYQiv4I/AAAAAAAAADg/lbwQ9kWNVz8/s1600-h/Sample.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 239px;" src="http://3.bp.blogspot.com/_03TyaixMOf0/S3X6kYQiv4I/AAAAAAAAADg/lbwQ9kWNVz8/s400/Sample.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5437527628013813634" /&gt;&lt;/a&gt;&lt;br /&gt;In this sample, I am using Linq to construct my objects into XML, then being able to read the XML with Linq and construct it back into my class objects.&lt;br /&gt;&lt;br /&gt;Writing (Linq to XML):&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;var xmlFile = &lt;br /&gt;    &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Movies"&lt;/span&gt;,&lt;br /&gt;    from m &lt;span class="kwrd"&gt;in&lt;/span&gt; movies&lt;br /&gt;    select &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Movie"&lt;/span&gt;,&lt;br /&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Title"&lt;/span&gt;, m.Title),&lt;br /&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Director"&lt;/span&gt;, m.Director),&lt;br /&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"ReleaseDate"&lt;/span&gt;, m.ReleaseDate),&lt;br /&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Casts"&lt;/span&gt;,&lt;br /&gt;            from c &lt;span class="kwrd"&gt;in&lt;/span&gt; m.Casts&lt;br /&gt;            select &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Cast"&lt;/span&gt;,&lt;br /&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Name"&lt;/span&gt;, c.Name),&lt;br /&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Dob"&lt;/span&gt;, c.Dob),&lt;br /&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Roles"&lt;/span&gt;,&lt;br /&gt;                    from r &lt;span class="kwrd"&gt;in&lt;/span&gt; c.Roles&lt;br /&gt;                    select &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"Role"&lt;/span&gt;,&lt;br /&gt;                        &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"MovieName"&lt;/span&gt;, r.Movie),&lt;br /&gt;                        &lt;span class="kwrd"&gt;new&lt;/span&gt; XElement(&lt;span class="str"&gt;"RoleName"&lt;/span&gt;, r.RoleName)))))));&lt;/pre&gt;&lt;br /&gt;Reading (XML to Linq):&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;var movies = &lt;br /&gt;    from m &lt;span class="kwrd"&gt;in&lt;/span&gt; xmlFile.Descendants(&lt;span class="str"&gt;"Movie"&lt;/span&gt;)&lt;br /&gt;    select &lt;span class="kwrd"&gt;new&lt;/span&gt; Movie&lt;br /&gt;    {&lt;br /&gt;        Title = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)m.Element(&lt;span class="str"&gt;"Title"&lt;/span&gt;),&lt;br /&gt;        Director = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)m.Element(&lt;span class="str"&gt;"Director"&lt;/span&gt;),&lt;br /&gt;        ReleaseDate = (DateTime)m.Element(&lt;span class="str"&gt;"ReleaseDate"&lt;/span&gt;),&lt;br /&gt;        Casts = (from c &lt;span class="kwrd"&gt;in&lt;/span&gt; m.Elements(&lt;span class="str"&gt;"Casts"&lt;/span&gt;).Descendants(&lt;span class="str"&gt;"Cast"&lt;/span&gt;)&lt;br /&gt;                 select &lt;span class="kwrd"&gt;new&lt;/span&gt; Cast&lt;br /&gt;                 {&lt;br /&gt;                    Name = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)c.Element(&lt;span class="str"&gt;"Name"&lt;/span&gt;),&lt;br /&gt;                    Dob = (DateTime)c.Element(&lt;span class="str"&gt;"Dob"&lt;/span&gt;),&lt;br /&gt;                    Roles = (from r &lt;span class="kwrd"&gt;in&lt;/span&gt; c.Elements(&lt;span class="str"&gt;"Roles"&lt;/span&gt;).Descendants(&lt;span class="str"&gt;"Role"&lt;/span&gt;)&lt;br /&gt;                             select &lt;span class="kwrd"&gt;new&lt;/span&gt; Role&lt;br /&gt;                             {&lt;br /&gt;                                Movie = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)r.Element(&lt;span class="str"&gt;"MovieName"&lt;/span&gt;),&lt;br /&gt;                                RoleName = (&lt;span class="kwrd"&gt;string&lt;/span&gt;)r.Element(&lt;span class="str"&gt;"RoleName"&lt;/span&gt;)&lt;br /&gt;                             }).ToList()&lt;br /&gt;                 }).ToList()&lt;br /&gt;    };&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/ReadingNWritingXmlFiles.zip"&gt;Reading and Writing Xml Files&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-1368343489630960163?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/1368343489630960163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=1368343489630960163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/1368343489630960163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/1368343489630960163'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2010/02/reading-and-writing-xml-with-linq.html' title='Reading and Writing XML with Linq'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_03TyaixMOf0/S3X6kYQiv4I/AAAAAAAAADg/lbwQ9kWNVz8/s72-c/Sample.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-4056694804705234428</id><published>2009-10-20T22:04:00.000-07:00</published><updated>2010-05-05T15:16:12.764-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IEnumerable'/><category scheme='http://www.blogger.com/atom/ns#' term='C# Extension'/><title type='text'>IEnumerable Extension</title><content type='html'>This is an IEnumerable extension method, that create a generic &lt;span style="font-weight:bold;"&gt;ObservableCollection&lt;/span&gt; from a generic &lt;span style="font-weight:bold;"&gt;IEnumerable&lt;/span&gt;.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CollectionExtensions&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ObservableCollection&amp;lt;T&amp;gt; ToObservableCollection&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; ienum)&lt;br /&gt;    {&lt;br /&gt;        ObservableCollection&amp;lt;T&amp;gt; oc = &lt;span class="kwrd"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;T&amp;gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (T i &lt;span class="kwrd"&gt;in&lt;/span&gt; ienum)&lt;br /&gt;        {&lt;br /&gt;            oc.Add(i);&lt;br /&gt;        }&lt;br /&gt;                &lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; oc;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Have the extension method residing in a namespace that can be common accessible by all.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-4056694804705234428?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/4056694804705234428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=4056694804705234428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/4056694804705234428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/4056694804705234428'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2009/10/ienumerable-extensions.html' title='IEnumerable Extension'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-8939380299250100882</id><published>2009-09-30T22:34:00.000-07:00</published><updated>2010-05-05T15:16:58.357-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF Memory Leaks'/><title type='text'>WPF Memory Leaks</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(153, 102, 51);font-size:130%;" &gt;Using of Event Handlers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Event handlers are a very common source of non-obvious memory leaks. For example, you think an event handler on an object is getting disposed when the object is destroyed, unaware that the object is not being released from memory, because the event handler is continued to be used elsewhere.&lt;br /&gt;&lt;br /&gt;If you subscribe to an event on object1 from object2, then dispose of object2 and assume it no longer exists (and drop out all references from your code); there is an implicit reference in object1's event that will prevent object2 from being garbage collected.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Code: &lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="str"&gt;SomeObject&lt;/span&gt; object1 = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="str"&gt;SomeObject&lt;/span&gt;();&lt;br /&gt;&lt;span class="str"&gt;OtherObject&lt;/span&gt; object2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="str"&gt;OtherObject&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;object1.SomeEvent += object2.myEventHandler;&lt;br /&gt;object2 = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Fix/Work around:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;object1.SomeEvent -= object2.myEventHandler;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is a common case of a leak; forgetting to unsubscribe from events. If you create an object that attaches an event handler, then this object must remove that event handler again (at an appropriate time).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 102, 51);font-size:130%;" &gt;Using of Static Variables&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is an example of creating a reference which is allocated to static variable, and by nature, static variables are not destroyed. By not setting the static variable back to null; this will cause the object to reference the static variable, and stop the garbage collector from disposing of the object.&lt;br /&gt;&lt;br /&gt;The static staticObject reference is always reachable from code; the garbage collector would not be able to destroy the allocated object.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Code:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="str"&gt;SomeStaticClass&lt;/span&gt; staticObject;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SomeStaticMethod()&lt;br /&gt;{&lt;br /&gt;    staticObject = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="str"&gt;SomeStaticClass&lt;/span&gt;();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Fix/Work around:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;staticObject = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;br /&gt;This is a common case of a leaking; forgetting to set an allocated object to null.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 102, 51);font-size:130%;" &gt;Using of DynamicResource&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It seems that using a DynamicResource to refer to a global resource can cause memory leaks to occur.&lt;br /&gt;&lt;br /&gt;• StaticResource - "look up the resource once, then just keep using the same value."&lt;br /&gt;• DynamicResource - "look up the resource each time it's needed, in case the value has changed."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Code:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;Background=&lt;span class="str"&gt;"{DynamicResource Style}"&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Fix/Work around:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;Background=&lt;span class="str"&gt;"{StaticResource Style}"&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Avoid using DynamicResource, use StaticResource to access resources unless you absolutely have to use a DynamicResource.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 102, 51);font-size:130%;" &gt;Using of RegisterClassCommandBinding/RegisterClassInputBinding&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can register a class command binding for a command, using CommandManager.RegisterClassCommandBinding or you can register a class input binding for an input, using CommandManager.RegisterClassInputBinding.&lt;br /&gt;&lt;br /&gt;However there is an internal bug with these two methods on the CommandManager class, which can cause memory leaks to occur - the garbage collector cannot unregister the binding.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Code: &lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="str"&gt;CommandManager&lt;/span&gt;.RegisterClassCommandBinding(type, command binding);&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Fix/Work around:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.&lt;span class="str"&gt;CommandBindings&lt;/span&gt;.Add(command binding);&lt;/pre&gt;&lt;br /&gt;Avoid using CommandManager and class command bindings; instead bind the command to the current instance object.  As the object is destroyed the command will now be destroyed with it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 102, 51);font-size:130%;" &gt;Using of BitmapEffects&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Up until .Net 3.5 SP1, all BitmapEffects were rendered in software, which causes memory leak.&lt;br /&gt;&lt;br /&gt;New Effects (now called BlurEffect, DropShadowEffect) are introduced as of .Net 3.5 SP1, which are hardware accelerated and rendered by the GPU, which will stop the memory leak (as claimed by Microsoft).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Code: &lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&amp;lt;Border.BitmapEffect&amp;gt;&lt;br /&gt;    &amp;lt;DropShadowBitmapEffect ShadowDepth=&lt;span class="str"&gt;"10"&lt;/span&gt; Softness=&lt;span class="str"&gt;"1"&lt;/span&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/Border.BitmapEffect&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Fix/Work around (from .NET 3.5 SP1):&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&amp;lt;Border.Effect&amp;gt;&lt;br /&gt;    &amp;lt;DropShadowBitmapEffect ShadowDepth=&lt;span class="str"&gt;"10"&lt;/span&gt; Softness=&lt;span class="str"&gt;"1"&lt;/span&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/Border.Effect&amp;gt;&lt;/pre&gt;&lt;br /&gt;As of .Net 3.5 SP1, you can use the new Effects classes instead. You must avoid using old Effects, i.e. BevelBitmapEffect, BlurBitmapEffect, DropShadowBitmapEffect, BevelBitmapEffect, EmbossBitmapEffect, OuterGlowBitmapEffect as these are now obsolete classes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 102, 51);font-size:130%;" &gt;Using of DataBinding&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Extract from Microsoft Bug Report:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Data binding operation that is not marked as OneTime must listen for property change notifications from the source object. WPF uses the built-in notifications of the DependencyProperties class or the notifications from the INotifyPropertyChanged interface.&lt;br /&gt;&lt;br /&gt;If the DependencyProperties class and the INotifyPropertyChanged interface are unavailable, WPF uses the ValueChanged event. This behavior involves calling the PropertyDescriptor.AddValueChanged method on the PropertyDescriptor object that corresponds to property.&lt;br /&gt;Unfortunately, this action causes the CLR to create a strong reference from this PropertyDescriptor object to source object. The CLR also keeps a reference to the PropertyDescriptor object in a global table. This behavior causes a reference chain to occur.&lt;br /&gt;&lt;br /&gt;As long as the data binding target is used, the binding must continue to listen for changes. This behavior keeps the reference alive between the PropertyDescriptor object and source object, and the target remains in use. This behavior causes a memory leak in source object and in every object to which source object refers. These objects include the data binding target.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Code: &lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;View:&lt;br /&gt;&amp;lt;CollectionViewSource x:Key=&lt;span class="str"&gt;"Results"&lt;/span&gt;&lt;br /&gt;    Source=&lt;span class="str"&gt;"{Binding Path=Data.SomeEntity}"&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;Entity:&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; &lt;span class="str"&gt;SomeEntity&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span class="rem"&gt;// Entity properties&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Fix/Work around:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;View:&lt;br /&gt;&amp;lt;CollectionViewSource x:Key=&lt;span class="str"&gt;"Results"&lt;/span&gt;&lt;br /&gt;    Source=&lt;span class="str"&gt;"{Binding Path=Data.SomeEntity}"&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;Entity:&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; &lt;span class="str"&gt;SomeEntity : INotifyPropertyChanged&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span class="rem"&gt;// Entity properties&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;You must implement the INotifyPropertyChanged interface on the entity that you are binding to in the view. By inheriting the from the BusinessBase class, you will implement the INotifyPropertyChanged interface.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(153, 102, 51);font-size:130%;" &gt;Using of Generic List to Data Bind&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The use of generic list on an entity, then data binding the generic list to the view; it cause a memory leak.&lt;br /&gt;Same problem as the previous example, as the generic list doesn’t implement the INotifyPropertyChanged interface.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Code:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; &lt;span class="str"&gt;SomeEntity : INotifyPropertyChanged&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span class="rem"&gt;// Entity properties&lt;/span&gt;&lt;br /&gt;    &lt;span class="str"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="str"&gt;User&lt;/span&gt;&amp;gt; Users { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The Fix/Work around:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; &lt;span class="str"&gt;UserCollection : ObservableCollection&lt;/span&gt;&amp;lt;&lt;span class="str"&gt;User&lt;/span&gt;&amp;gt;&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; &lt;span class="str"&gt;SomeEntity : INotifyPropertyChanged&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span class="rem"&gt;// Entity properties&lt;/span&gt;&lt;br /&gt;    &lt;span class="str"&gt;UserCollection&lt;/span&gt; Users { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;It is recommended that you use ObservableCollection class instead of the generic list class as it implements the INotifyPropertyChanged interface, and provides many additional benefits. You can then bind the collection to the view without causing a memory leak.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-8939380299250100882?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/8939380299250100882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=8939380299250100882' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/8939380299250100882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/8939380299250100882'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2009/09/wpf-memory-leaks.html' title='WPF Memory Leaks'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-7452647808725507632</id><published>2009-05-01T11:55:00.000-07:00</published><updated>2009-06-11T08:51:53.598-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Regular Expression'/><title type='text'>Money Validator</title><content type='html'>I wrote this money (whole dollar) validation method.&lt;br /&gt;It use a regular expression to validate a whole dollar.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MoneyValidator&lt;br /&gt;{&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Regular expression, which is used to validate an whole dollar (money).&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PATTERN = &lt;span class="str"&gt;@"^\$?(((\d{1,3},*)+\d{3})|\d+)$"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// Checks whether the given dollar value is valid.&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="money"&amp;gt;String that contains an dollar.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;True, if valid dollar; otherwise false.&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsValidDollar(&lt;span class="kwrd"&gt;string&lt;/span&gt; money)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(money))&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; Regex.IsMatch(money, PATTERN, RegexOptions.IgnoreCase);&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;I've been doing alot of unit testing @ work recently. The theory is that everything that you write must be unit tested.  &lt;br /&gt;So, I've written this unit test to validate that the function will pass for all whole dollar that I think should be valid and invalid.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Summary description for UnitTest&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;[TestClass]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; UnitTest&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; _money;&lt;br /&gt;    &lt;span class="kwrd"&gt;bool&lt;/span&gt; _result;&lt;br /&gt;&lt;br /&gt;    [TestMethod]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ValidMoneyNormal()&lt;br /&gt;    {&lt;br /&gt;        _money = &lt;span class="str"&gt;"$1"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"1"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$10"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"10"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$100"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"100"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$1000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"1000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$1,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"1,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$10000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"10000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$10,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"10,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$100000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"100000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$100,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"100,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$1000000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"1000000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$1,000,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"1,000,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsTrue(result, _money);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [TestMethod]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InValidMoneyNormal()&lt;br /&gt;    {&lt;br /&gt;        _money = &lt;span class="str"&gt;"$1.99"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"1.99"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$90,999.99"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"90,999.99"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$2..0"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"2..0"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"2,8"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"2,00,0"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"2,00"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$20,00"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"1,0$00,000,000"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$$3"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"2,,,0"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$200$"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$2d"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"$2,,0"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;&lt;br /&gt;        _money = &lt;span class="str"&gt;"2$3"&lt;/span&gt;;&lt;br /&gt;        result = MoneyValidator.IsValidDollar(_money);&lt;br /&gt;        Assert.IsFalse(result, _money);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/MoneyTestProject.zip"&gt;Money Validator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-7452647808725507632?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/7452647808725507632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=7452647808725507632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/7452647808725507632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/7452647808725507632'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2009/05/money-validator.html' title='Money Validator'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-1875166511322403119</id><published>2009-01-07T17:08:00.000-08:00</published><updated>2010-10-31T05:22:28.302-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF Sliding Adorner'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF Drag Drop'/><title type='text'>WPF Animated Sliding Adorner</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_03TyaixMOf0/SXg35cahZsI/AAAAAAAAAC4/URHvuRW0Uzo/s1600-h/SlidingAdorner.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 148px;" src="http://1.bp.blogspot.com/_03TyaixMOf0/SXg35cahZsI/AAAAAAAAAC4/URHvuRW0Uzo/s320/SlidingAdorner.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5294042821993522882" /&gt;&lt;/a&gt;I wanted to create a custom control that would have the ability to have an animated part sliding out of it.  My first through was to have this control have the ability to slide out in any direction (left, right, up or down), and that it had to be an adorner (to be able on slide on top of other objects etc).&lt;br /&gt;And second to that was the thing that was created, was also a custom control, letting the user define what the control would content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/SlidingAdorner.zip"&gt;Animated Sliding Adorner&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-1875166511322403119?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/1875166511322403119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=1875166511322403119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/1875166511322403119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/1875166511322403119'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2009/01/wpf-animated-sliding-adorner.html' title='WPF Animated Sliding Adorner'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_03TyaixMOf0/SXg35cahZsI/AAAAAAAAAC4/URHvuRW0Uzo/s72-c/SlidingAdorner.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-6241053399192139899</id><published>2008-12-10T07:53:00.001-08:00</published><updated>2010-10-31T06:07:47.262-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF Fisheye Control'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF Animated Dashboard'/><title type='text'>WPF Fisheye Control</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_03TyaixMOf0/SXdK0igEBZI/AAAAAAAAACw/gcrmguWvVvQ/s1600-h/DashBoard.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_03TyaixMOf0/SXdK0igEBZI/AAAAAAAAACw/gcrmguWvVvQ/s320/DashBoard.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5293782153472247186" /&gt;&lt;/a&gt;If you are a big fan of Apple - Mac OS X Leopard, you will love this WPF animated dashboard that I've created.&lt;br /&gt;&lt;br /&gt;I was inspired to build a control (Fish Eye effect) that would mimic the dashboard of the Mac's.&lt;br /&gt;&lt;br /&gt;This is a simple implementation of the Fish Eye control:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&amp;lt;Controls:FishEyeControl VerticalAlignment=&lt;span class="str"&gt;"Bottom"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;Image Source=&lt;span class="str"&gt;"{Binding Source={x:Static Images:ImageConstants.MESSAGES}}"&lt;/span&gt; &lt;br /&gt;           Width=&lt;span class="str"&gt;"32"&lt;/span&gt; &lt;br /&gt;           Height=&lt;span class="str"&gt;"32"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;Image Source=&lt;span class="str"&gt;"{Binding Source={x:Static Images:ImageConstants.CONTACTS}}"&lt;/span&gt; &lt;br /&gt;           Width=&lt;span class="str"&gt;"32"&lt;/span&gt; &lt;br /&gt;           Height=&lt;span class="str"&gt;"32"&lt;/span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;Image Source=&lt;span class="str"&gt;"{Binding Source={x:Static Images:ImageConstants.CALENDAR}}"&lt;/span&gt; &lt;br /&gt;           Width=&lt;span class="str"&gt;"32"&lt;/span&gt; &lt;br /&gt;           Height=&lt;span class="str"&gt;"32"&lt;/span&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/Controls:FishEyeControl&amp;gt;&lt;/pre&gt; &lt;br /&gt;This is a dynamic implementation (ItemsControl) of the Fish Eye control:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&amp;lt;ItemsControl ItemsSource=&lt;span class="str"&gt;"{Binding Path=DashBoardApps}"&lt;/span&gt; VerticalAlignment=&lt;span class="str"&gt;"Bottom"&lt;/span&gt; HorizontalAlignment=&lt;span class="str"&gt;"Center"&lt;/span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;ItemsControl.ItemsPanel&amp;gt;&lt;br /&gt;        &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;            &amp;lt;Controls:FishEyeControl /&amp;gt;&lt;br /&gt;        &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;    &amp;lt;/ItemsControl.ItemsPanel&amp;gt;&lt;br /&gt;    &amp;lt;ItemsControl.ItemTemplate&amp;gt;&lt;br /&gt;        &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;            &amp;lt;StackPanel Orientation=&lt;span class="str"&gt;"Vertical"&lt;/span&gt;&amp;gt;&lt;br /&gt;                &amp;lt;TextBlock x:Name=&lt;span class="str"&gt;"txtAppName"&lt;/span&gt; &lt;br /&gt;                           Text=&lt;span class="str"&gt;"{Binding Path=ApplicationName}"&lt;/span&gt; &lt;br /&gt;                           TextAlignment=&lt;span class="str"&gt;"Center"&lt;/span&gt; &lt;br /&gt;                           Visibility=&lt;span class="str"&gt;"Hidden"&lt;/span&gt; &lt;br /&gt;                           FontSize=&lt;span class="str"&gt;"7px"&lt;/span&gt; &lt;br /&gt;                           Foreground=&lt;span class="str"&gt;"#eff7ff"&lt;/span&gt; /&amp;gt;&lt;br /&gt;                &amp;lt;Button Width=&lt;span class="str"&gt;"32"&lt;/span&gt; Height=&lt;span class="str"&gt;"32"&lt;/span&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;Image Source=&lt;span class="str"&gt;"{Binding Path=ApplicationImage}"&lt;/span&gt; /&amp;gt;&lt;br /&gt;                &amp;lt;/Button&amp;gt;&lt;br /&gt;            &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;            &amp;lt;DataTemplate.Triggers&amp;gt;&lt;br /&gt;                &amp;lt;Trigger Property=&lt;span class="str"&gt;"IsMouseOver"&lt;/span&gt; Value=&lt;span class="str"&gt;"True"&lt;/span&gt;&amp;gt;&lt;br /&gt;                    &amp;lt;Setter TargetName=&lt;span class="str"&gt;"txtAppName"&lt;/span&gt; Property=&lt;span class="str"&gt;"Visibility"&lt;/span&gt; Value=&lt;span class="str"&gt;"Visible"&lt;/span&gt; /&amp;gt;&lt;br /&gt;                &amp;lt;/Trigger&amp;gt;&lt;br /&gt;            &amp;lt;/DataTemplate.Triggers&amp;gt;&lt;br /&gt;        &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;    &amp;lt;/ItemsControl.ItemTemplate&amp;gt;&lt;br /&gt;&amp;lt;/ItemsControl&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/MyDashBoard.zip"&gt;Animated Dashboard&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-6241053399192139899?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/6241053399192139899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=6241053399192139899' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/6241053399192139899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/6241053399192139899'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2008/12/wpf-animated-dashboard.html' title='WPF Fisheye Control'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_03TyaixMOf0/SXdK0igEBZI/AAAAAAAAACw/gcrmguWvVvQ/s72-c/DashBoard.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-1080533018277143029</id><published>2008-11-24T18:08:00.000-08:00</published><updated>2010-10-31T06:06:52.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C# Parallel Programming'/><title type='text'>Can Parallel Programming Improve Performance</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_03TyaixMOf0/SXM2xIeE50I/AAAAAAAAACQ/Q9HD9wtzyJc/s1600-h/SpeedTest.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 259px; height: 320px;" src="http://2.bp.blogspot.com/_03TyaixMOf0/SXM2xIeE50I/AAAAAAAAACQ/Q9HD9wtzyJc/s320/SpeedTest.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5292634204805588802" /&gt;&lt;/a&gt;I love to optimize my code for performance, whenever I can.&lt;br /&gt;So I wrote a simple speed test to see what works best.&lt;br /&gt;&lt;br /&gt;I've use the new System.Threading, provided in the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&amp;displaylang=en"&gt;Parallel Extensions June 08 CTP&lt;/a&gt; from Microsoft and I have to said it is bloody awesome.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;For example a simple for / foreach loop:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt; (var item = 0; item &amp;lt; list.Length; item++)&lt;br /&gt;{&lt;br /&gt;    DoSomeWork();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var item &lt;span class="kwrd"&gt;in&lt;/span&gt; list)&lt;br /&gt;{&lt;br /&gt;    DoSomeWork();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;This is the same example, but using a parallel for / foreach loop:&lt;/span&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;pre class="csharpcode"&gt;Parallel.For(0, list.Length, item =&amp;gt; { DoSomeWork(); });&lt;br /&gt;&lt;br /&gt;Parallel.ForEach(list, DoSomeWork);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Coding it is as easy as pie, it makes use of all the cores that your CPU has to offer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/SpeedTest.zip"&gt;Speed Test&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-1080533018277143029?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/1080533018277143029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=1080533018277143029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/1080533018277143029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/1080533018277143029'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2008/11/code-performance-speed.html' title='Can Parallel Programming Improve Performance'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_03TyaixMOf0/SXM2xIeE50I/AAAAAAAAACQ/Q9HD9wtzyJc/s72-c/SpeedTest.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-8429456453429165334</id><published>2008-11-13T08:24:00.000-08:00</published><updated>2010-10-31T07:04:24.176-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF List View'/><title type='text'>Using WPF ListView to display Complex Data Structure</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_03TyaixMOf0/SYBhmaN94HI/AAAAAAAAADI/SEWlt91lNsI/s1600-h/Movie_Library.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_03TyaixMOf0/SYBhmaN94HI/AAAAAAAAADI/SEWlt91lNsI/s320/Movie_Library.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5296340474288529522" /&gt;&lt;/a&gt;I was ask @ work today, to display in a WPF List View, a list of items and within each item there are other list of items (subclass within a class).&lt;br /&gt;&lt;br /&gt;There are lots of examples on the net to display to simple class.&lt;br /&gt;But in the real world there is no simple data structure, only complex data structure.&lt;br /&gt;&lt;br /&gt;I wrote is example to demonstrate the point.&lt;br /&gt;Imagine that you have a list of movies, and each movie has a movie id, a title, a list (subclass) of images and descriptions for the movie, a list (subclass) of cast in the movie and a list (subclass) of movie recommendations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Code:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;A list of Movies&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Movie&amp;gt; MovieData&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;And each Movie has&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Movie&lt;br /&gt;{&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; MovieId { get; set; }&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; IList&amp;lt;MovieInfos&amp;gt; Infos { get; set; }&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; IList&amp;lt;Cast&amp;gt; Cast { get; set; }&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; IList&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; Recommendations { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;MovieInfos is a subclass in the Movie class&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MovieInfos&lt;br /&gt;{&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Description { get; set; }&lt;br /&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; ImageSource MovieImage { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Xaml:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Bind the list of movies to the WPF List View&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&amp;lt;ListView ItemsSource=&lt;span class="str"&gt;"{Binding Path=MovieData}"&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;ListView.View&amp;gt;&lt;br /&gt;       &amp;lt;GridView&amp;gt;&lt;br /&gt;           &amp;lt;GridViewColumn DisplayMemberBinding=&lt;span class="str"&gt;"{Binding Path=MovieId}"&lt;/span&gt; Header=&lt;span class="str"&gt;"Movie Id"&lt;/span&gt; /&amp;gt;&lt;br /&gt;           &amp;lt;GridViewColumn DisplayMemberBinding=&lt;span class="str"&gt;"{Binding Path=Title}"&lt;/span&gt; Header=&lt;span class="str"&gt;"Title"&lt;/span&gt; /&amp;gt;&lt;br /&gt;           &amp;lt;!-- Can Bind to complex subclass --&amp;gt;&lt;br /&gt;           &amp;lt;GridViewColumn Header=&lt;span class="str"&gt;"Movie(s)"&lt;/span&gt;&amp;gt;&lt;br /&gt;               &amp;lt;GridViewColumn.CellTemplate&amp;gt;&lt;br /&gt;                   &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;                       &amp;lt;StackPanel&amp;gt;&lt;br /&gt;                           &amp;lt;ItemsControl ItemsSource=&lt;span class="str"&gt;"{Binding Path=Infos}"&lt;/span&gt;&amp;gt;&lt;br /&gt;                               &amp;lt;ItemsControl.ItemsPanel&amp;gt;&lt;br /&gt;                                   &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;                                       &amp;lt;WrapPanel Orientation=&lt;span class="str"&gt;"Horizontal"&lt;/span&gt;/&amp;gt;&lt;br /&gt;                                   &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;                               &amp;lt;/ItemsControl.ItemsPanel&amp;gt;&lt;br /&gt;                               &amp;lt;ItemsControl.ItemTemplate&amp;gt;&lt;br /&gt;                                   &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;                                       &amp;lt;StackPanel&amp;gt;&lt;br /&gt;                                           &amp;lt;Image ToolTip=&lt;span class="str"&gt;"{Binding Path=Description}"&lt;/span&gt;&lt;br /&gt;                                                          Source=&lt;span class="str"&gt;"{Binding Path=MovieImage}"&lt;/span&gt;&lt;br /&gt;                                                          Margin=&lt;span class="str"&gt;"3,0,3,0"&lt;/span&gt;&lt;br /&gt;                                                          Height=&lt;span class="str"&gt;"125"&lt;/span&gt; Width=&lt;span class="str"&gt;"75"&lt;/span&gt; /&amp;gt;&lt;br /&gt;                                       &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;                                   &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;                               &amp;lt;/ItemsControl.ItemTemplate&amp;gt;&lt;br /&gt;                           &amp;lt;/ItemsControl&amp;gt;&lt;br /&gt;                       &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;                   &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;               &amp;lt;/GridViewColumn.CellTemplate&amp;gt;&lt;br /&gt;           &amp;lt;/GridViewColumn&amp;gt;&lt;br /&gt;           &amp;lt;!-- Binding with data triggers --&amp;gt;&lt;br /&gt;           &amp;lt;GridViewColumn Header=&lt;span class="str"&gt;"Cast"&lt;/span&gt;&amp;gt;&lt;br /&gt;               &amp;lt;GridViewColumn.CellTemplate&amp;gt;&lt;br /&gt;                   &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;                       &amp;lt;StackPanel&amp;gt;&lt;br /&gt;                           &amp;lt;ItemsControl ItemsSource=&lt;span class="str"&gt;"{Binding Path=Cast}"&lt;/span&gt;&amp;gt;&lt;br /&gt;                               &amp;lt;ItemsControl.ItemsPanel&amp;gt;&lt;br /&gt;                                   &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;                                       &amp;lt;WrapPanel Orientation=&lt;span class="str"&gt;"Vertical"&lt;/span&gt; /&amp;gt;&lt;br /&gt;                                   &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;                               &amp;lt;/ItemsControl.ItemsPanel&amp;gt;&lt;br /&gt;                               &amp;lt;ItemsControl.ItemTemplate&amp;gt;&lt;br /&gt;                                   &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;                                       &amp;lt;StackPanel Orientation=&lt;span class="str"&gt;"Horizontal"&lt;/span&gt;&amp;gt;&lt;br /&gt;                                           &amp;lt;TextBlock x:Name=&lt;span class="str"&gt;"tbName"&lt;/span&gt; Text=&lt;span class="str"&gt;"{Binding Path=Name}"&lt;/span&gt;/&amp;gt;&lt;br /&gt;                                                   &amp;lt;Image x:Name=&lt;span class="str"&gt;"imgStar"&lt;/span&gt;&lt;br /&gt;                                                          Visibility=&lt;span class="str"&gt;"Collapsed"&lt;/span&gt;&lt;br /&gt;                                                          Source=&lt;span class="str"&gt;"{Binding Source={x:Static constants:ImageConstants.STAR}}"&lt;/span&gt;&lt;br /&gt;                                                          Height=&lt;span class="str"&gt;"16"&lt;/span&gt; Width=&lt;span class="str"&gt;"16"&lt;/span&gt; Margin=&lt;span class="str"&gt;"3,0,0,0"&lt;/span&gt; /&amp;gt;&lt;br /&gt;                                       &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;                                       &amp;lt;DataTemplate.Triggers&amp;gt;&lt;br /&gt;                                           &amp;lt;DataTrigger Binding=&lt;span class="str"&gt;"{Binding Path=MainCharacter}"&lt;/span&gt; Value=&lt;span class="str"&gt;"True"&lt;/span&gt;&amp;gt;&lt;br /&gt;                                               &amp;lt;Setter TargetName=&lt;span class="str"&gt;"tbName"&lt;/span&gt; Property=&lt;span class="str"&gt;"Foreground"&lt;/span&gt; Value=&lt;span class="str"&gt;"Red"&lt;/span&gt; /&amp;gt;&lt;br /&gt;                                               &amp;lt;Setter TargetName=&lt;span class="str"&gt;"imgStar"&lt;/span&gt; Property=&lt;span class="str"&gt;"Visibility"&lt;/span&gt; Value=&lt;span class="str"&gt;"Visible"&lt;/span&gt; /&amp;gt;&lt;br /&gt;                                           &amp;lt;/DataTrigger&amp;gt;&lt;br /&gt;                                       &amp;lt;/DataTemplate.Triggers&amp;gt;&lt;br /&gt;                                   &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;                               &amp;lt;/ItemsControl.ItemTemplate&amp;gt;&lt;br /&gt;                           &amp;lt;/ItemsControl&amp;gt;&lt;br /&gt;                       &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;                   &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;               &amp;lt;/GridViewColumn.CellTemplate&amp;gt;&lt;br /&gt;           &amp;lt;/GridViewColumn&amp;gt;&lt;br /&gt;           &amp;lt;!-- Simple binding --&amp;gt;&lt;br /&gt;           &amp;lt;GridViewColumn Header=&lt;span class="str"&gt;"Recommendations"&lt;/span&gt;&amp;gt;&lt;br /&gt;               &amp;lt;GridViewColumn.CellTemplate&amp;gt;&lt;br /&gt;                   &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;                       &amp;lt;StackPanel&amp;gt;&lt;br /&gt;                           &amp;lt;ItemsControl ItemsSource=&lt;span class="str"&gt;"{Binding Path=Recommendations}"&lt;/span&gt;&amp;gt;&lt;br /&gt;                               &amp;lt;ItemsControl.ItemsPanel&amp;gt;&lt;br /&gt;                                   &amp;lt;ItemsPanelTemplate&amp;gt;&lt;br /&gt;                                       &amp;lt;WrapPanel Orientation=&lt;span class="str"&gt;"Vertical"&lt;/span&gt;/&amp;gt;&lt;br /&gt;                                   &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;br /&gt;                               &amp;lt;/ItemsControl.ItemsPanel&amp;gt;&lt;br /&gt;                               &amp;lt;ItemsControl.ItemTemplate&amp;gt;&lt;br /&gt;                                   &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;                                       &amp;lt;StackPanel&amp;gt;&lt;br /&gt;                                           &amp;lt;TextBlock Text=&lt;span class="str"&gt;"{Binding}"&lt;/span&gt;/&amp;gt;&lt;br /&gt;                                       &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;                                   &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;                               &amp;lt;/ItemsControl.ItemTemplate&amp;gt;&lt;br /&gt;                           &amp;lt;/ItemsControl&amp;gt;&lt;br /&gt;                       &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;                   &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;               &amp;lt;/GridViewColumn.CellTemplate&amp;gt;&lt;br /&gt;           &amp;lt;/GridViewColumn&amp;gt;&lt;br /&gt;       &amp;lt;/GridView&amp;gt;&lt;br /&gt;   &amp;lt;/ListView.View&amp;gt;&lt;br /&gt;&amp;lt;/ListView&amp;gt;&lt;/pre&gt;&lt;br /&gt;This sample demonstrates the power of WPF List View.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/UsingItemsControlInListView.zip"&gt;Using Items Control in WPF List View&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-8429456453429165334?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/8429456453429165334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=8429456453429165334' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/8429456453429165334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/8429456453429165334'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2008/11/using-listvew-to-display-complex-data.html' title='Using WPF ListView to display Complex Data Structure'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_03TyaixMOf0/SYBhmaN94HI/AAAAAAAAADI/SEWlt91lNsI/s72-c/Movie_Library.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-7588029066044341519</id><published>2008-10-29T08:18:00.000-07:00</published><updated>2009-01-21T22:30:21.398-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>Use LINQ to count items in a List</title><content type='html'>I wanted a way to go through a list of items and get a count for each distinct item in the list. &lt;br /&gt;To do this nice and easy, I just use LINQ.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;br /&gt;{&lt;br /&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main()&lt;br /&gt;        {&lt;br /&gt;            var cities = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&lt;br /&gt;                             {&lt;br /&gt;                                 &lt;span class="str"&gt;"Sydney"&lt;/span&gt;, &lt;br /&gt;                                 &lt;span class="str"&gt;"Perth"&lt;/span&gt;, &lt;br /&gt;                                 &lt;span class="str"&gt;"Sydney"&lt;/span&gt;, &lt;br /&gt;                                 &lt;span class="str"&gt;"Melbourne"&lt;/span&gt;, &lt;br /&gt;                                 &lt;span class="str"&gt;"Brisbane"&lt;/span&gt;, &lt;br /&gt;                                 &lt;span class="str"&gt;"Melbourne"&lt;/span&gt;,&lt;br /&gt;                                 &lt;span class="str"&gt;"Sydney"&lt;/span&gt;&lt;br /&gt;                             };&lt;br /&gt;&lt;br /&gt;            var result = (from c &lt;span class="kwrd"&gt;in&lt;/span&gt; cities&lt;br /&gt;                          group c by c into grouping&lt;br /&gt;                          orderby grouping.Key ascending&lt;br /&gt;                          select &lt;span class="kwrd"&gt;new&lt;/span&gt; {grouping.Key, Count = grouping.Count()});&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var item &lt;span class="kwrd"&gt;in&lt;/span&gt; result)&lt;br /&gt;            {&lt;br /&gt;                 Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"City={0}, Count={1}"&lt;/span&gt;, item.Key, item.Count));&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Console.ReadLine();&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/LinqCountItemsInAList.zip"&gt;Count items in a List using LINQ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-7588029066044341519?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/7588029066044341519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=7588029066044341519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/7588029066044341519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/7588029066044341519'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2008/10/i-wanted-way-to-go-through-list-of.html' title='Use LINQ to count items in a List'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-3932184594459184258</id><published>2008-09-16T19:33:00.000-07:00</published><updated>2009-06-11T09:35:52.789-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Regular Expression'/><title type='text'>Email Address Validator</title><content type='html'>I wrote this email address validation method a few months ago.&lt;br /&gt;It use a regular expression to validate an email address.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; EmailAddressValidator&lt;br /&gt;{&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Regular expression, which is used to validate an email address.&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PATTERN = &lt;span class="str"&gt;@"^[a-z|0-9][a-z|0-9]*([_'-][a-z|0-9]+)*"&lt;/span&gt; +&lt;br /&gt;                                       &lt;span class="str"&gt;@"(([.][a-z|0-9]+)+([_'-][a-z|0-9]+)*)?@"&lt;/span&gt; +&lt;br /&gt;                                       &lt;span class="str"&gt;@"[a-z|0-9][a-z|0-9]*([-][a-z|0-9]+)*"&lt;/span&gt; +&lt;br /&gt;                                       &lt;span class="str"&gt;@"(([.][a-z|0-9]+)+([-][a-z|0-9]+)*)$"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// Checks whether the given email address is valid.&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name="emailAddress"&amp;gt;String that contains an email address.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;True, if valid email address; otherwise false.&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsValidEmailAddress(&lt;span class="kwrd"&gt;string&lt;/span&gt; emailAddress)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(emailAddress))&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; Regex.IsMatch(emailAddress, PATTERN, RegexOptions.IgnoreCase);&lt;br /&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;I wrote this unit test to validate that the function will pass for all email that I think should be valid and invalid.&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// Summary description for UnitTest&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;[TestClass]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; UnitTest&lt;br /&gt;{&lt;br /&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; _emailAddress;&lt;br /&gt;        &lt;span class="kwrd"&gt;bool&lt;/span&gt; _result;&lt;br /&gt;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ValidEmailAddressNormal()&lt;br /&gt;        {&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"a@b.c"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe@home.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe.bob123@home.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"123joe@home.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe.bob@home.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe.bob@his.home.place"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"duke_me.baby@hotmail.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"o'reilly@there.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"uat-test.me@hotmail123.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe_bob@jb-test.com.au"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"duty.it.sit.dev.prog@test.com.au"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe.bob@google.it.com.au"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe.bob@123.test.me.co.uk"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsTrue(result, _emailAddress);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [TestMethod]&lt;br /&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InValidEmailAddressNormal()&lt;br /&gt;        {&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe@home"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe-bob[at]home.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe.@bob.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;".joe@bob.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe@.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe..bob@bob.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe&amp;lt;&amp;gt;bob@bob.come"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe~bob@bob.come"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe&amp;amp;bob@bob.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"~joe@bob.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe$bob@bob.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe+bob@bob.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe_bob@hotmail..com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"joe_bob@hotmail...com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"email withspace@hotmail.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"test@hot_mail.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;&lt;br /&gt;            _emailAddress = &lt;span class="str"&gt;"test@o'reilly.com"&lt;/span&gt;;&lt;br /&gt;            result = EmailAddressValidator.IsValidEmailAddress(_emailAddress);&lt;br /&gt;            Assert.IsFalse(result, _emailAddress);&lt;br /&gt;        }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/EmailTestProject.zip"&gt;Email Address Validator&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-3932184594459184258?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/3932184594459184258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=3932184594459184258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/3932184594459184258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/3932184594459184258'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2008/09/email-validator.html' title='Email Address Validator'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6150253848868465050.post-6766452313739719902</id><published>2008-09-11T09:57:00.001-07:00</published><updated>2010-10-27T15:57:01.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF Drop Down Button'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF Split Button'/><title type='text'>WPF drop down and split button</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_03TyaixMOf0/SXg4dKpRf4I/AAAAAAAAADA/c04YOZpH4MY/s1600-h/Buttons.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 127px;" src="http://4.bp.blogspot.com/_03TyaixMOf0/SXg4dKpRf4I/AAAAAAAAADA/c04YOZpH4MY/s320/Buttons.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5294043435698847618" /&gt;&lt;/a&gt;I've been trying to create a drop down button and a split button in WPF.&lt;br /&gt;It has been very frustrating, but I think I finally got it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/huyphamproject/Home/UserControl.zip"&gt;Drop Down and Split Button ver 1.2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have updated the split button control to use command binding.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Please let me know if this helps you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6150253848868465050-6766452313739719902?l=huydinhpham.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://huydinhpham.blogspot.com/feeds/6766452313739719902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6150253848868465050&amp;postID=6766452313739719902' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/6766452313739719902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6150253848868465050/posts/default/6766452313739719902'/><link rel='alternate' type='text/html' href='http://huydinhpham.blogspot.com/2008/09/wpf-drop-down-and-split-button.html' title='WPF drop down and split button'/><author><name>Huy Pham</name><uri>http://www.blogger.com/profile/04273482529941972418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_03TyaixMOf0/SXg4dKpRf4I/AAAAAAAAADA/c04YOZpH4MY/s72-c/Buttons.jpg' height='72' width='72'/><thr:total>8</thr:total></entry></feed>
