tag:blogger.com,1999:blog-6208569234143463852024-03-13T09:44:52.546-06:00The Xaml WorkshopEngineering rich internet experiences using Silverlight... and some T-SQL... and .NET, so basically anything with code - except PL/SQL, those Oracle developers think they're so superior!Matt Robinsonhttp://www.blogger.com/profile/18135815064583382099noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-620856923414346385.post-82794582524426187122010-09-21T13:44:00.003-06:002010-09-21T13:58:09.079-06:00WCF Error: The underlying connection was closed: The connection was closed unexpectedly.<span class="Apple-style-span" style="font-size: x-large;"><b><span class="Apple-style-span" style="color: red;">CommunicationException was unhandled</span></b></span><br />
<span class="Apple-style-span" style="font-size: x-large;"><span class="Apple-style-span" style="color: red;">The underlying connection was closed: The connection was closed unexpectedly.</span></span><br />
<br />
Once in a while I have come across this error while creating and testing a new WCF service. And, after hours of searching for remedies, I have finally found it.<br />
<br />
First let's start off with some "solutions" that didn't work. While it was necessary for me to increase the limits on the Service and Client side configs, that was not the issue. Nevertheless, for my uses, these were good add-ins:<br />
<br />
In my Web.config file I added the following settings, the pertinent data in yellow:<br />
<br />
<br />
<span class="Apple-style-span" style="color: blue;"><</span><span class="Apple-style-span" style="color: #660000;">bindings</span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: blue;"><</span><span class="Apple-style-span" style="color: #660000;">basicHttpBinding</span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: blue;"><</span><span class="Apple-style-span" style="color: #660000;">binding </span><span class="Apple-style-span" style="color: red;">name</span><span class="Apple-style-span" style="color: blue;">="Carbon.CarbonServiceBinding"</span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;">allowCookies</span><span class="Apple-style-span" style="color: blue;">="true"</span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxBufferPoolSize</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="2147483647"</span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxBufferSize</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="2147483647"</span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="background-color: white;"> </span></span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxReceivedMessageSize</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="2147483647"</span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">closeTimeout</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="00:10:00"</span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">openTimeout</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="00:10:00"</span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">receiveTimeout</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="00:10:00"</span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">sendTimeout</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="00:10:00"</span></span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;"><</span></span><span class="Apple-style-span" style="color: #660000;"><span class="Apple-style-span" style="background-color: yellow;">readerQuotas </span></span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxDepth</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="64" </span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxStringContentLength</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="2147483647" </span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxArrayLength</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="2147483647" </span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxBytesPerRead</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="4096" </span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxNameTableCharCount</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="16384"</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">/></span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: blue;"><</span>/<span class="Apple-style-span" style="color: #660000;">binding</span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: blue;"><</span>/<span class="Apple-style-span" style="color: #660000;">basicHttpBinding</span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-style-span" style="color: blue;"><</span>/<span class="Apple-style-span" style="color: #660000;">bindings</span><span class="Apple-style-span" style="color: blue;">></span><br />
<br />
<br />
<span class="Apple-style-span" style="color: blue;"><</span><span class="Apple-style-span" style="color: #660000;">behaviors</span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: blue;"><</span><span class="Apple-style-span" style="color: #660000;">serviceBehaviors</span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: blue;"><</span><span class="Apple-style-span" style="color: #660000;">behavior </span><span class="Apple-style-span" style="color: red;">name</span><span class="Apple-style-span" style="color: blue;">="Carbon.CarbonServiceBehavior"></span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;"><</span></span><span class="Apple-style-span" style="color: #660000;"><span class="Apple-style-span" style="background-color: yellow;">dataContractSerializer</span></span><span class="Apple-style-span" style="background-color: yellow;"> </span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">maxItemsInObjectGraph</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="2147483647"/></span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="color: blue;"> </span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;"><</span></span><span class="Apple-style-span" style="color: #660000;"><span class="Apple-style-span" style="background-color: yellow;">serviceTimeouts </span></span><span class="Apple-style-span" style="color: red;"><span class="Apple-style-span" style="background-color: yellow;">transactionTimeout</span></span><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="background-color: yellow;">="00:10:00"/></span></span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="color: blue;"> </span></span><span class="Apple-style-span" style="color: blue;"><</span><span class="Apple-style-span" style="color: #660000;">serviceMetadata </span><span class="Apple-style-span" style="color: red;">httpGetEnabled</span><span class="Apple-style-span" style="color: blue;">="true"/></span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="color: blue;"> </span></span><span class="Apple-style-span" style="color: blue;"><</span><span class="Apple-style-span" style="color: #660000;">serviceDebug </span><span class="Apple-style-span" style="color: red;">includeExceptionDetailInFaults</span><span class="Apple-style-span" style="color: blue;">="true"/></span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="color: blue;"> </span></span><span class="Apple-style-span" style="color: blue;"><</span>/<span class="Apple-style-span" style="color: #660000;">behavior</span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="color: blue;"> </span></span><span class="Apple-style-span" style="color: blue;"></span><span class="Apple-style-span" style="color: #660000;">serviceBehaviors</span><span class="Apple-style-span" style="color: blue;">></span><br />
<span class="Apple-style-span" style="color: blue;"></span><span class="Apple-style-span" style="color: #660000;">behaviors</span><span class="Apple-style-span" style="color: blue;">></span><br />
<br />
This did not fix the issue and I kept getting the closed connection exception. The issue was discovered when I began looking into the class that was being returned by my web method and its Data Contract and Members.<br />
<br />
My class, named ReturnContainer had a GUID, bool and some strings all marked as Data Member. However there was one member of type object. During some of the processing that gets done, an XElement is assigned to this object member. And, apparently WCF does not know how to serialize an XElement. The solution, for good measure, was 2 fold:<br />
<br />
<ol><li><span class="Apple-style-span" style="font-size: x-large;"><span class="Apple-style-span" style="color: white;">Change object data type to string</span></span></li>
<li><span class="Apple-style-span" style="font-size: x-large;"><span class="Apple-style-span" style="color: white;">Change all methods that assign to the member to include a .ToString() when necessary</span></span></li>
</ol>In a nutshell, this error can be caused by large data sets, but in my case, was caused by a failure to serialize certain data types.<br />
<br />
<span class="Apple-style-span" style="color: blue;"><br />
</span>Matt Robinsonhttp://www.blogger.com/profile/18135815064583382099noreply@blogger.com0tag:blogger.com,1999:blog-620856923414346385.post-68789347756421790802010-08-25T15:17:00.004-06:002010-08-31T11:49:04.212-06:00Same-Old Apple Business Philosophy: iCrapThe other day, while watching television, I was treated to a newer Apple commercial promoting the iPad. There was one glaring annoyance that I have not been able to stop from creeping into my anti-Apple thoughts.<br />
<br />
<span class="Apple-style-span" style="font-size: x-large;">Should we judge the quality of a product by the quality of add-on products?</span><br />
<br />
Many of my friends, family and other acquaintances have been asking me "When are you getting an iPhone?" Everyone seems to think that Apple has some sort of superior, amazing technology that someone like me, a software engineer, shouldn't be able to live without. The reality of the matter is that Apple, principally via the iPhone, is dumbing things down so much that people think that it is because of Apple that they can now do all sorts of new and amazing things on their phone.<br />
<br />
<span class="Apple-style-span" style="font-size: x-large;">Wrong.</span><br />
<br />
It has nothing to do whatsoever with Apple. In fact, if people would get off the gimpy, lopsided Apple fad bandwagon they would see that it may have been the first, but no where near the best. Sure, we could go around in circles on the Apple debate, but we wouldn't get anywhere because 99% of all iPhone consumers are not fans of even mildly technical subjects - much less the kind of technical knowledge that would be required to have an intelligent debate on the matter.<br />
<br />
The fact is that people confuse the quality of an app with the quality of the device. Sure, turn on your iPad or iPhone and you can do all sorts of cool and amazing things. Thank software developers, not Apple. You can get the same exact app for your Android device, with better performance and multi-tasking. Of course the downside of all of this is that the general public is now having the ability to do new and complex things that before took more effort, patience and skill. <br />
<br />
Now, as a software engineer, I shouldn't be against making user-friendly applications for end-users, but it is a paradox without any easy or apparent answers, much less a balanced compromise. Take for example MySpace. Some would argue that MySpace gave the end-user the ability to totally customize their home page. While that sort of customization may be handy as a feature, think about the end result: putting creative powers in incompetent hands. How many people really know how to create a pleasing, aesthetic web page? Not many; it's a skill that is learned. But, if we give the general public absolute graphical power, we get a horrible mash of colors and animations and blinking text. Why? Because they can. Just like Dr. Malcom said in Jurassic Park: "They were so preoccupied with whether they <i>could</i>, they never bothered to think about if they <i>should</i>."<br />
<br />
Unfortunately, Apple has blinded their consumers to the mere existence of other smart phones. Apple consumers will blindly choose an Apple device just because it has the Apple logo on it. They see a commercial that portrays some massive touch screen and some neighborly mid-20s person doing something amazing and they just have to have it. Would you like a better product? No! No! Why not? <br />
<br />
<span class="Apple-style-span" style="font-size: x-large;">Because... it's not an iPhone</span>.<br />
<br />
Us software engineers and other good consumers of conscience have only one thing to look forward to: the day when Apple commits technological suicide - again. Apple wasn't doing so bad a few decades ago, but they went so far proprietary that they almost ended up as a chapter in history. The mindset of the Apple company is not to embrace application or open development standards. They want everyone to adopt their ways. Take Microsoft, for example. While you can argue for hours over the actions and corporate ethics, look at what they have done for the development community. You can get everything you need to build powerful, rich applications - <b>free</b>. Want to build a website using traditional scripting and languages? Want to build rich web applications using the latest (and greatest) software? Want to design traditional applications? Want to design web services? Want to create your own database? It doesn't matter because all of this is free. And not just that, there is so much available to learn from: tutorials, videos, whitepapers, blogs, etc.<br />
<br />
If Apple was smart, they would capitalize and learn to make friends of the development community. Not ostracize them in exchange for a few minutes in the limelight. But, they wont. History will run its course, and Apple will once again go the way of the bell-bottom. Almost gone for a few decades until some demented soul tries to resurrect it.Matt Robinsonhttp://www.blogger.com/profile/18135815064583382099noreply@blogger.com0tag:blogger.com,1999:blog-620856923414346385.post-91923850005897787912010-07-28T11:33:00.000-06:002010-07-28T11:33:21.396-06:00Building a Dynamic, Efficient Data Auditing ModelWelcome to the wonderful world of data audits. As anyone who has ever dealt with annoying managers and clueless users knows, the word "database" is thrown around to skirt responsibility and as a crutch. We all know managers who don't believe a report because they "know the numbers aren't right", and users who "don't know how the client's email got deleted". For us developers, audit data is a lifesaver. Why? Because data doesn't lie. It may not always tell us what we want to hear - it may tell us an application is broken or a user is doing something they shouldn't be - but that's not the data's fault.<br />
<br />
So, how do we make data auditing dynamic, efficient and ruthlessly accurate? That's the subject for todays post. To accomplish this, we will use <b><span class="Apple-style-span" style="color: #9fc5e8;">Tables</span></b>, <span class="Apple-style-span" style="color: #9fc5e8;"><b>Triggers</b></span>, <b><span class="Apple-style-span" style="color: #9fc5e8;">Functions </span></b>and <b><span class="Apple-style-span" style="color: #9fc5e8;">Procedures</span></b>.<br />
<br />
As usual, all bold keywords, references and pertinent articles are linked to at the end of the post.<br />
<br />
Let's start our scenario with a simple table called Orders, as represented by the following script:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVxd2Xb-c0uFYNSCYDx5xM_Hxsy-oPWDW4mfm2KfJkUF2YSGvi_2wrb29jUhACEn-QKVsDYkz7bqWADFDacYxRDAOrmOny3671YJTg0fuW3uXt-dFEGQ7fenIgp3hv1xMJ0QSzuCFwhwQ/s1600/Create+table.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVxd2Xb-c0uFYNSCYDx5xM_Hxsy-oPWDW4mfm2KfJkUF2YSGvi_2wrb29jUhACEn-QKVsDYkz7bqWADFDacYxRDAOrmOny3671YJTg0fuW3uXt-dFEGQ7fenIgp3hv1xMJ0QSzuCFwhwQ/s400/Create+table.bmp" width="400" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
In order to get audit data on each <b><span class="Apple-style-span" style="color: #9fc5e8;">INSERT </span></b>and <b><span class="Apple-style-span" style="color: #9fc5e8;">UPDATE</span></b>, we need to utilize triggers. However, to do this effectively we would need to handle each column and write data to an audit table. This may seem cumbersome, probably because it is. So, to make this scenario dynamic we are going to start with an additional table, as modeled below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgECy1txuX_FI3ChG-dyFIzBHsd7_vv3zw9JAz-YGHluEzmIIcUGWE8Sw5Tv9hEOBW1QrJn5C3YU62aGt-7adZy35J01qu6RkXuiSDHh07pkVYhdaOrDEIU-B7qNby0edRFWMrOa8ATRgY/s1600/New+Picture.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgECy1txuX_FI3ChG-dyFIzBHsd7_vv3zw9JAz-YGHluEzmIIcUGWE8Sw5Tv9hEOBW1QrJn5C3YU62aGt-7adZy35J01qu6RkXuiSDHh07pkVYhdaOrDEIU-B7qNby0edRFWMrOa8ATRgY/s400/New+Picture.bmp" width="400" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Each time we INSERT or UPDATE a record, the data will be added to this table. A trigger similar to the snippet below would be required:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieORnrf2VYunVl7A-11vP0SUhd3oqaKBA_GyeCPeYgCO3d6AlMcl8beOWrYHAnhUu3xnVjFn_R0IbC2udyCDiJ4YgJAjnn_kF9Yu05qwqQUt-AjGMfvPYHu5dmQaPP9Tn4t9VWsgOzP1s/s1600/New+Picture+(1).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="489" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieORnrf2VYunVl7A-11vP0SUhd3oqaKBA_GyeCPeYgCO3d6AlMcl8beOWrYHAnhUu3xnVjFn_R0IbC2udyCDiJ4YgJAjnn_kF9Yu05qwqQUt-AjGMfvPYHu5dmQaPP9Tn4t9VWsgOzP1s/s640/New+Picture+(1).bmp" width="640" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
As we can imagine, writing a trigger similar to this for each table, including each column would be a task and a half. So... why not have a procedure do it for us? This is taking the dynamic piece of the data audit model to the next level. But, before we write the procedure to do all of this for us, let's stop and think about the triggers.<br />
<br />
Sure, writing them in the first place is a chore. But, what if we don't care about a column or two in our audits. Say for example we had 2 columns in our Orders table called Changed_At and Changed_By. These simply recorded the user and time stamp of the last change. We wouldn't need to audit these, since they are, in a way, an inline audit method. So, to make the column auditing dynamic, let's create 2 additional tables and a function.<br />
<br />
The 2 tables are very simple and between them contain only 6 columns. They are modeled below:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfnmCxXVmOKorlH6KUpiqY6PGUpuZVUIFleNkEHMOa6YJRGaLsSY5VJKrhrAd81Zh8eVPbIUMf3ML77ysprugatAt4YdPcCKGPsEfLJvB3gJCmUw8MvhIQbrx4DXcmKyC8QPi2m5Lkhl4/s1600/New+Picture+(2).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfnmCxXVmOKorlH6KUpiqY6PGUpuZVUIFleNkEHMOa6YJRGaLsSY5VJKrhrAd81Zh8eVPbIUMf3ML77ysprugatAt4YdPcCKGPsEfLJvB3gJCmUw8MvhIQbrx4DXcmKyC8QPi2m5Lkhl4/s640/New+Picture+(2).bmp" width="640" /></a>The idea here is very simple, we can tell the trigger to audit or ignore any given column in a table we have. The creation and or updating of the trigger will be done inside the procedure we will write in a moment. Before that we will need a function. All this function does is return a table of all the columns we have decided to audit on a given table. The function could be written as follows:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilrShg-gg1gM3I4CV_boxpPS0O5cZpBFsN4gU1AEBq1Fbui85IiW4uK-ccH3wcEIs9ElBKTn7OsfIYdLDPiW9Bnye3TIKNEsy4dS866L15esMYzUv-mL67BG_ildq_5bawBv-m5Ld7dJY/s1600/New+Picture+(3).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="367" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilrShg-gg1gM3I4CV_boxpPS0O5cZpBFsN4gU1AEBq1Fbui85IiW4uK-ccH3wcEIs9ElBKTn7OsfIYdLDPiW9Bnye3TIKNEsy4dS866L15esMYzUv-mL67BG_ildq_5bawBv-m5Ld7dJY/s400/New+Picture+(3).bmp" width="400" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
This function is very simple, and joins the tables we just created on the <b><span class="Apple-style-span" style="color: #9fc5e8;">INFORMATION_SCHEMA</span></b>. The result: a table of the columns that a) actually exist in the table and b) are set to be audited for the passed in table name.<br />
<br />
Now, it's time to move on to the actual procedure that does the manual labor for us. Broken into logical pieces, the first bit is as follows:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMbvU81ibIQ5MD_eMv3eYA3NWoonV27Se90IEqWM1fIQP4C3M50PFEfSMeJLU-Y-IAco5llt5B2wGsyeUtPR_PiztzXhyphenhyphenuhyphenhyphenmr_L6Sy7-XhuYrPKFHV-iNwLaLuB5STu_HcyblAWeHp3s/s1600/New+Picture+(4).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMbvU81ibIQ5MD_eMv3eYA3NWoonV27Se90IEqWM1fIQP4C3M50PFEfSMeJLU-Y-IAco5llt5B2wGsyeUtPR_PiztzXhyphenhyphenuhyphenhyphenmr_L6Sy7-XhuYrPKFHV-iNwLaLuB5STu_HcyblAWeHp3s/s400/New+Picture+(4).bmp" width="400" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
The procedure takes only 3 (at most, and 1 at minimum) input parameters and outputs 2. The table name is self-explanatory, and the <b><span class="Apple-style-span" style="color: #990000;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">@ForInsert</span></span></b> and <span class="Apple-style-span" style="color: #990000;"><b><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">@ForUpdate</span></b></span> bits will allow us further dynamic-ness by letting us choose if we want to audit one type or another or both.<br />
<br />
The first few lines set up our output values to their defaults and do some basic validation. After all, if we do not want to use insert nor update triggers, what is there to do? And if the table doesn't exist - if there is no valid <b><span class="Apple-style-span" style="color: #9fc5e8;">OBJECT_ID </span></b>- then we can't rightly add triggers to it.<br />
<br />
After that, some basic variables are declared that we will utilize in the following snippets.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioEEC1w9VQk71gZl5dS5RiDyJKWsL84Wk8H3Xp3OttotOdIJnAkqessrEUhZVYilDOAvg7D3Vh1pChM_DenkMuzvHzwuMl8tJPtYwvVSQePX4W6y4JMCKAOQJKfNv7hmc1xDi4JZW75GI/s1600/New+Picture+(6).bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="369" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioEEC1w9VQk71gZl5dS5RiDyJKWsL84Wk8H3Xp3OttotOdIJnAkqessrEUhZVYilDOAvg7D3Vh1pChM_DenkMuzvHzwuMl8tJPtYwvVSQePX4W6y4JMCKAOQJKfNv7hmc1xDi4JZW75GI/s640/New+Picture+(6).bmp" width="640" /></a></div><br />
<br />
This is the declaration of the try block that will allow us to catch fatal errors and report them to the user via the <b><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: #990000;">@Success</span></span></b> and <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><b><span class="Apple-style-span" style="color: #990000;">@Message</span></b></span> outputs. The first order of business is to get the <b><span class="Apple-style-span" style="color: #9fc5e8;">primary key</span></b> for the passed table. This example will only work if there is a single PK on the table; no more; no less. For other scenarios, the code would need to be modified slightly.<br />
<br />
If we are going to use insert triggers, this block constructs <b><span class="Apple-style-span" style="color: #9fc5e8;">dynamic SQL</span></b> and places it into the <span class="Apple-style-span" style="color: #990000;"><b><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">@ColumnTriggerSection</span></b></span> variable using a <b><span class="Apple-style-span" style="color: #9fc5e8;">WHILE </span></b>loop. The loop is populated from the INFORMATION_SCHEMA and writes the trigger for all columns in the table. You may choose to exclude the PK field, and to do so would be as easy as adding an additional <b><span class="Apple-style-span" style="color: #9fc5e8;">WHERE </span></b>clause to the insert.<br />
<br />
The setting of the trigger section using dynamic SQL is quite easy, since we are essentially using the code from the trigger example towards the beginning and just adding it in a loop. The final section for the insert just adds the trigger declaration and body and, most importantly, determines if we need to <b><span class="Apple-style-span" style="color: #9fc5e8;">DROP</span></b>/<b><span class="Apple-style-span" style="color: #9fc5e8;">CREATE </span></b>or just a CREATE.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHvrJv0D9rjWiZ-YMmC9JVQC5NwYsbfl5p2FzUBDm1x6DsF0vHZxmb8NwNUJ54fALnhAC78lttXUJvbIDO95F_LmINWUeMMaAkS3nehTZzWZptUNF_n8pO68Q9HoFFkIl4_KK61zCLBYE/s1600/New+Picture+(7).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="261" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHvrJv0D9rjWiZ-YMmC9JVQC5NwYsbfl5p2FzUBDm1x6DsF0vHZxmb8NwNUJ54fALnhAC78lttXUJvbIDO95F_LmINWUeMMaAkS3nehTZzWZptUNF_n8pO68Q9HoFFkIl4_KK61zCLBYE/s400/New+Picture+(7).bmp" width="400" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
The code that follows, for the update trigger portion is virtually identical. The differences are in the dynamic SQL that we generate in the loop for each column and the creation of the trigger itself. These need to be slightly different, as the name cannot be duplicated, and on update, we are going to record the old value and the new value.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipfGksXkSs_Gi0RwUSeeimlq1kp5o0E_jIM20MmdSBxC-c8NPaBXWgN_t6Jn-VMgbtr0kPighoBhin0CXgDQLE-0sUMJRdwfy9vZpGh-iOvTVNaZw5T3TQJXu9hmzg197eJHn2o11dNGk/s1600/New+Picture+(8).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="331" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipfGksXkSs_Gi0RwUSeeimlq1kp5o0E_jIM20MmdSBxC-c8NPaBXWgN_t6Jn-VMgbtr0kPighoBhin0CXgDQLE-0sUMJRdwfy9vZpGh-iOvTVNaZw5T3TQJXu9hmzg197eJHn2o11dNGk/s640/New+Picture+(8).bmp" width="640" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Now that we have all of our objects created: audit data table, audit customization tables, audit column function and our dynamic trigger creation procedure - let's test her out.<br />
<br />
Let's first execute our procedure for the Orders table like so:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAHMB8FuzVOlaw7ZlESs_jOfJz1uJkCMVSJZ2uot14MhZheQ_mCYP22zIJ6DaDAoaS0ukUxKEpVN3b24JmPiU_4tEQEqJbuB3vht19ux5Z9t-6Qy2OXJ-T0TRe3CrTBsJSHkhdJ5qqsPA/s1600/Copy+of+New+Picture+(9).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="45" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAHMB8FuzVOlaw7ZlESs_jOfJz1uJkCMVSJZ2uot14MhZheQ_mCYP22zIJ6DaDAoaS0ukUxKEpVN3b24JmPiU_4tEQEqJbuB3vht19ux5Z9t-6Qy2OXJ-T0TRe3CrTBsJSHkhdJ5qqsPA/s400/Copy+of+New+Picture+(9).bmp" width="400" /></a></div><br />
<br />
<br />
<br />
Next, let's add some data into the Orders table via an insert, then change some of it via an update. For example, we forget to add the customer's email address and sign them up for a subscription. <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRt7BUUm4KVQSoboF5Nm8z4GuGQv-1pz5DiP_UKSddhRH9bGiMgi6TzX3Mu71vmxJcxf3VxXB_J8aLR2nWEo6vt5KRxYds1TSyagxfk-PRPlRswHKnho3EM8MkcgpKYiq-vsU5oBxP4Is/s1600/Copy+(2)+of+New+Picture+(9).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRt7BUUm4KVQSoboF5Nm8z4GuGQv-1pz5DiP_UKSddhRH9bGiMgi6TzX3Mu71vmxJcxf3VxXB_J8aLR2nWEo6vt5KRxYds1TSyagxfk-PRPlRswHKnho3EM8MkcgpKYiq-vsU5oBxP4Is/s400/Copy+(2)+of+New+Picture+(9).bmp" width="400" /></a></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
The results, when we query our Audit_Data table would be similar to this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSqQVf65JBd7e_QbaYfA6xkiROW4g1HMwUCc0nlSJdU-UMKrRmVOf0pZDy_HxxlpwNn06v1BYC5Ye6mFvTqcNp47FPHP4pOiRvZyTfeYrOOPFsSsbNWHp4ItL7OLAyLos5x0JNK3l9Oeg/s1600/Copy+(4)+of+New+Picture+(9).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="139" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSqQVf65JBd7e_QbaYfA6xkiROW4g1HMwUCc0nlSJdU-UMKrRmVOf0pZDy_HxxlpwNn06v1BYC5Ye6mFvTqcNp47FPHP4pOiRvZyTfeYrOOPFsSsbNWHp4ItL7OLAyLos5x0JNK3l9Oeg/s640/Copy+(4)+of+New+Picture+(9).bmp" width="640" /></a></div><br />
<br />
As we can see, our original insert created values in the New_Value column only, since there technically was no old data. However, when we updated, we can see new rows with a different timestamp for the 2 columns we updated.<br />
<br />
Summary: we now can track every change on every row - transparently, dynamically and mercilessly.<br />
<br />
<a href="http://msdn.microsoft.com/en-us/library/ms174979.aspx">Tables</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms178110.aspx">Triggers</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms191320.aspx">Functions</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms190669.aspx">Procedures</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms174335.aspx">INSERT Statement</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms177523.aspx">UPDATE Statement</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms186778.aspx">INFORMATION_SCHEMA</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms190328.aspx">OBJECT_ID</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms191236.aspx">Primary Key Constraints</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms709342(VS.85).aspx">Dynamic SQL</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms178642.aspx">WHILE Loop</a><br />
<a href="http://msdn.microsoft.com/en-US/library/ms188047(v=SQL.90).aspx">WHERE Clause</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms173497.aspx">Drop Trigger</a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms189799.aspx">Create Trigger</a>Matt Robinsonhttp://www.blogger.com/profile/18135815064583382099noreply@blogger.com0tag:blogger.com,1999:blog-620856923414346385.post-10177104921118375382010-07-27T10:18:00.010-06:002010-07-27T10:26:29.880-06:00Converting Delimited Data Into a Table<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">In this post we will examine the powerful potential of </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Table-valued Functions</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">!</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">As per usual, all bold keywords and pertinent </span></span><i><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">MSDN </span></span></i><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">articles are linked at the bottom of the post.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">To setup the scenario for this example, you can probably think of several instances when you pass a comma or semi-colon delimited list of values into a </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Stored Procedure</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">, and need to parse each value separately. This function will do just that, but in a re-usable, dynamic way.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">To begin, lets open </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Microsoft SQL Server Management Studio</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">. For this example, I am using </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">SQL Server 2008</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">, but the principles can be transferred to most any </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">RDBMS</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">. Let's begin by connecting to the appropriate server and database. Let's expand the Programmability tree and the Functions tree.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">We can right-click the Table-valued Functions tree and select "New Multi-statement Table-valued Function..." from the dropdown menu. This will open a new query tab, with some templated content, as seen below.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUF5MwQtr-1QEF9U2tV6JLIHDSn9STpwog8bLBWGdFpDewK_wYYOTIrtrMHQMZI9S1RXgozhZMsd9teNG0GNovSbSXEBPk1ZVYJ6hI2oASX1SW1nga5Gzc-3_xICGPj9nDBHCyyhrsCvE/s1600/New+Picture+(9).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUF5MwQtr-1QEF9U2tV6JLIHDSn9STpwog8bLBWGdFpDewK_wYYOTIrtrMHQMZI9S1RXgozhZMsd9teNG0GNovSbSXEBPk1ZVYJ6hI2oASX1SW1nga5Gzc-3_xICGPj9nDBHCyyhrsCvE/s640/New+Picture+(9).bmp" width="484" /></span></span></a></div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Obviously, there are quite a few invalid statements and code, but we need to replace it all with our real content. Let's begin by removing the first 10 lines of comments, and optionally the Author comment lines. Now we need to give our new function a name, such as </span></span><i><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">ParseSingleDelimitedString</span></span></i><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">. I placed mine in the </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">dbo</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> schema, but you may need to specify another if your circumstance warrants it. And, of course, leaving the schema name blank in the function name will place it automatically in the dbo schema.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">For a base essentials function, you could just specify one parameter, </span></span><b><span class="Apple-style-span" style="color: #990000;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">@String</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">, that contains the delimited data to be parsed. For my function, I also included </span></span><b><span class="Apple-style-span" style="color: #990000;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">@Delimiter</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">, </span></span><b><span class="Apple-style-span" style="color: #990000;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">@IgnoreBlankValues</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> and </span></span><b><span class="Apple-style-span" style="color: #990000;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">@TreatBlankAsNull</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">. These can be hard-coded, but I wanted to make the function as dynamic as possible.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">In our function template, we also need to specify the table structure we will be returning. In my example, I included a </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Primary Key</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> with an </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Identity</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> value, but this is completely optional. So, up to now, my function looks like below.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrdTHA8hNeHEdRlSoywg5pMZFRKoWSsyiX0WeTLc1E4Uu1usz1_DgeOD6dLzs_Ke8kRS0yTT9-ntE0q7I-xbDqVyr2nxmRZ_YE3KHbUnTV8bI_XLx4VrWndA2bEUTBr8DSfVcUW4vN-d4/s1600/New+Picture+(11).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrdTHA8hNeHEdRlSoywg5pMZFRKoWSsyiX0WeTLc1E4Uu1usz1_DgeOD6dLzs_Ke8kRS0yTT9-ntE0q7I-xbDqVyr2nxmRZ_YE3KHbUnTV8bI_XLx4VrWndA2bEUTBr8DSfVcUW4vN-d4/s640/New+Picture+(11).bmp" width="640" /></span></span></a></div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Once the signature of the function has been completed, we can now move on to the body, where the real magic is done. The work that the body does is not complicated, but does require some thought. The logic of it is this: Loop through the string and select the left-most characters until we find the delimiter character. Add it to our table and remove the current iteration from the string data and repeat until the string is of 0 length. Naturally, there is a little more to it than that, but it gives us a base for what our function body should look like.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">For my function, I put the </span></span><b><span class="Apple-style-span" style="color: #990000;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">@String</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> parameter into a local </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">variable</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> and do all my manipulation on that one. I also created an additional variable, </span></span><b><span class="Apple-style-span" style="color: #990000;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">@CurrentValue</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">, that will be used to contain the current iteration. Below is the entire function body, which we will step through.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiap74FAzu9-d0tcgvmaZC6jn4GeLMcEHh5yr1noUo5RCe79sZz_tJGt-XXIilUzYBUxNPml8TIAKS9UUBYoaz3k30lasO5-EFlfIAiIrFcSTqzZWBtQHUzCuGTcfr-c6cWCfqGYN4Yiww/s1600/New+Picture+(12).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="555" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiap74FAzu9-d0tcgvmaZC6jn4GeLMcEHh5yr1noUo5RCe79sZz_tJGt-XXIilUzYBUxNPml8TIAKS9UUBYoaz3k30lasO5-EFlfIAiIrFcSTqzZWBtQHUzCuGTcfr-c6cWCfqGYN4Yiww/s640/New+Picture+(12).bmp" width="640" /></span></span></a></div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">The loop, a </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">WHILE </span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">statement, simply makes sure that we are working with a valid string, not with empty data. </span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">The next step in my function is to determine if a blank value was passed - signified by a delimiter character being the left-most character. If so, we can handle it as desired. In my function, how it is handled is based on a parameter.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">The next step is to determine if our delimiter exists in the string data. If so, we can parse the left-most string data into our current value, or if it doesn't exist, we can assume that the string contains the last of the delimited values. Either way, we can set our current variable and proceed.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Our last step is to add the value to the table we are returning. My function does some blank value logic, but that is technically optional.</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">So, there you go. Execute the code, and then test it by calling it, as per the code below. The results are sweet, especially because you can use the function as part of a </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">SELECT</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> statement on in a </span></span><b><span class="Apple-style-span" style="color: #9fc5e8;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">WHERE </span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">clause!</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUb7skXU0FGYDj1hyphenhyphenYp_nG-EzjNL54xibPsv-kiyQEbWFLomjgfyjOe6Ob09t_w3GaWsYbsA5VunB1fD6t7YvEkzkJ_rfv-pAjqkvzMJTM4dMs3auhzrMrWTv42vq4MRqbwciKah9FIpM/s1600/New+Picture+(13).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUb7skXU0FGYDj1hyphenhyphenYp_nG-EzjNL54xibPsv-kiyQEbWFLomjgfyjOe6Ob09t_w3GaWsYbsA5VunB1fD6t7YvEkzkJ_rfv-pAjqkvzMJTM4dMs3auhzrMrWTv42vq4MRqbwciKah9FIpM/s400/New+Picture+(13).bmp" width="400" /></span></span></a></div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><br />
<span class="Apple-style-span" style="line-height: 18px;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><br />
<span class="Apple-style-span" style="line-height: 18px;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><br />
<span class="Apple-style-span" style="line-height: 18px;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><br />
<span class="Apple-style-span" style="line-height: 18px;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><br />
<span class="Apple-style-span" style="line-height: 18px;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span> </span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; line-height: 18px;">If you liked this post, please feel free to forward it on or comment.</span><br />
<span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><br />
</span> </span><br />
<a href="http://msdn.microsoft.com/en-us/library/ms191165.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Table-valued Functions</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/aa174792(SQL.80).aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Stored Procedure</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms174173.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Microsoft SQL Server Management Studio</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/bb545450.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">SQL Server</span></span></a><br />
<a href="http://en.wikipedia.org/wiki/Relational_database_management_system"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">RDBMS</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/aa905208(SQL.80).aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">dbo Schema</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms191236.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Primary Key</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms186775.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Identity Property</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms188927.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Variable</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms178642.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">WHILE Loop</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms189499.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">SELECT Statement</span></span></a><br />
<a href="http://msdn.microsoft.com/en-us/library/ms177634.aspx"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">FROM Clause</span></span></a>Matt Robinsonhttp://www.blogger.com/profile/18135815064583382099noreply@blogger.comtag:blogger.com,1999:blog-620856923414346385.post-15361835546936328902010-07-26T13:30:00.002-06:002010-07-26T13:36:11.951-06:00How-To : Data Binding & Behaviors<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Welcome to the </span></span><b><span class="Apple-style-span" style="color: #073763;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Data Binding & Behaviors</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> How-To!</span></span><br />
<div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">All bold keywords and other pertinent </span></span><i><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">MSDN </span></span></i><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">articles and references appear at the end of the post.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">For this example, we will utilize the power of </span></span><span class="Apple-style-span" style="color: #073763;"><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Data Binding</span></span></b></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> and the </span></span><span class="Apple-style-span" style="color: #073763;"><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">InvokeCommandAction</span></span></b></span><span class="Apple-style-span" style="color: #0b5394;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> </span></span></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">behavior in a </span></span><span class="Apple-style-span" style="color: #073763;"><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">UserControl</span></span></b></span><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">. </span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Let's imagine this scenario: we are creating a web application, and need to perform the same task when multiple controls receive the </span></span><b><span class="Apple-style-span" style="color: #073763;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Click </span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">event. In my real-life solution, I am building a shell using </span></span><b><span class="Apple-style-span" style="color: #073763;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Silverlight 4</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> and </span></span><b><span class="Apple-style-span" style="color: #073763;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">MEF</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">. This shell will act something like an OS in that multiple applications can be open at once, using "windows" to hold different and unique data. The "windows" are a UserControl that contains, among other things, a close button. One of my goals in developing this application was to use the Xaml architecture to the fullest - include as little code-behind as possible. Not that code-behind is bad, or even unwanted - because it is a requirement - I just felt that what all I could do in the Xaml would keep the code as clean and easy to debug as possible. This theory was even more impressed when I thought of what all different types of events I would need to include in the code-behind for something as simple as our "windows".</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">The resulting solution was to use data binding and behaviors. So, without further ado, let's jump into </span></span><b><span class="Apple-style-span" style="color: #073763;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Blend </span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">and sort this out. What we start with is a UserControl with a bunch of added content, but let's focus on the elementbuttonClose control below.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBG8apzNfrFEAUHu1I16oN_THqAAawmy-l0f1zCRhLkoM2RncOZ5zYiEqmz4Rvfm4_92ToeaYXbfyumB9acW70wzCCtGycdbekG0r88VjPlcJPoY-089MN0w4FKxZxV9ozPYw1H5u9awA/s1600/New+Picture.bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="104" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBG8apzNfrFEAUHu1I16oN_THqAAawmy-l0f1zCRhLkoM2RncOZ5zYiEqmz4Rvfm4_92ToeaYXbfyumB9acW70wzCCtGycdbekG0r88VjPlcJPoY-089MN0w4FKxZxV9ozPYw1H5u9awA/s640/New+Picture.bmp" width="640" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">From the Assets menu, on the toolbar or the tab, select Behaviors and drag the InvokeCommandAction behavior to the control and drop it.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN2xbFMsXdaFJ_Zy91nEmFIjWlcROMeLsX-G9A9JUDVZQ8EZ0rolvmqpFAwgMESg4UVPqmOaDSv2tvXCaE1pE1zJyU6XJ0fHBB8M1rlHwEDErO2CHrxdNtp17HnrqFb1jQXcPAHYtQPxw/s1600/New+Picture+(1).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="144" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN2xbFMsXdaFJ_Zy91nEmFIjWlcROMeLsX-G9A9JUDVZQ8EZ0rolvmqpFAwgMESg4UVPqmOaDSv2tvXCaE1pE1zJyU6XJ0fHBB8M1rlHwEDErO2CHrxdNtp17HnrqFb1jQXcPAHYtQPxw/s320/New+Picture+(1).bmp" width="320" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">The result of this operation is that we have some new content added to our control and new properties become available on the Properties tab, as seen below.</span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy2MrKaXglErcVhrf1bS26GpMVltt92Xjc7PGd8_1q-2V_xuBj7Wg60VS9AYaDuR92oM21_wPbxZjenBpxoB88-QC1hoaBFJXNSe5YgDhf9988mk1ZnG8itjydukSpJPPqW-gDL3LdOh4/s1600/New+Picture+(2).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy2MrKaXglErcVhrf1bS26GpMVltt92Xjc7PGd8_1q-2V_xuBj7Wg60VS9AYaDuR92oM21_wPbxZjenBpxoB88-QC1hoaBFJXNSe5YgDhf9988mk1ZnG8itjydukSpJPPqW-gDL3LdOh4/s640/New+Picture+(2).bmp" width="640" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEQYC34mCLqviiRzWRY4-Gbb-9x3z-wN4aWKaxSeqHciWS5ivFep-fRgVMpiKmhiHTQ7YGMLYsaxqerVhgUtIMMF8NXXCDlyC3_2MNQmf4F-CVNvoECiW6GYAAEPRPDW1AeuVsvNZUCPc/s1600/New+Picture+(3).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEQYC34mCLqviiRzWRY4-Gbb-9x3z-wN4aWKaxSeqHciWS5ivFep-fRgVMpiKmhiHTQ7YGMLYsaxqerVhgUtIMMF8NXXCDlyC3_2MNQmf4F-CVNvoECiW6GYAAEPRPDW1AeuVsvNZUCPc/s400/New+Picture+(3).bmp" width="211" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Once we have this behavior attached to the control, we can now use data binding to perform the magic. However, there is some code to be created before we can entirely wire things up. Switching over to </span></span><b><span class="Apple-style-span" style="color: #073763;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Visual Studio</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">, we will need to create our command that will be executed. I created a folder called Objects and under that, another named Actions. This is where i created a new class called CloseModule. The actual class is quite simple and straight-forward, as can be seen from the snippet below.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVvDzapxbJV5navAuoxlCTfKxoKDBdTlMIMzosg-8cWnbPqyJcdPYpNmMMMJHCDOIxiLVfyZEhP_N521gQGaGb1d1C895zbs699kbP_RHQ285rPNS670safPM-A_or9GmKONVjGfhdyfc/s1600/New+Picture+(4).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVvDzapxbJV5navAuoxlCTfKxoKDBdTlMIMzosg-8cWnbPqyJcdPYpNmMMMJHCDOIxiLVfyZEhP_N521gQGaGb1d1C895zbs699kbP_RHQ285rPNS670safPM-A_or9GmKONVjGfhdyfc/s320/New+Picture+(4).bmp" width="320" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">As you can see, the class implements the </span></span><b><span class="Apple-style-span" style="color: #073763;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">ICommand</span></span></span></b><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> interface. This is important because we could create a plain method, but that would prevent us from passing in parameters with as much ease. Implementing ICommand is as easy as Ctrl + . and selecting the appropriate option. Once the 2 methods are added, we can modify them to fit our functionality. For purposes of this command, the required method CanExecute always returns a true value, but depending on the circumstances you may want to add additional functionality or logic.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">The execute method in my class will require the parameter value to be of type ModuleContainer, the "window" used to store data using MEF. The magic of this parameter is in the data binding, and for that let's go back to Blend. Our first order of business is to add a reference to our new ICommand class inthe App.xaml file. Optionally, you can add it as a resource in the Xaml page you will be calling it in, but I chose to make it a little more accessible. You can add it to any Xaml page like so:</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5g9SIkc74B_x8s_oNybNxWkTJS-D5wWXkB-eCuqv3Bqu2vMfFoUUQmp-9POLIhPgLLvJHMOTYHVz36DnUca6ay4bnZa8hBOQFV_hgPMeO2bEDxIoYnGf6bx0gbbmzdozZ0NUvRknqwNo/s1600/New+Picture+(5).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="47" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5g9SIkc74B_x8s_oNybNxWkTJS-D5wWXkB-eCuqv3Bqu2vMfFoUUQmp-9POLIhPgLLvJHMOTYHVz36DnUca6ay4bnZa8hBOQFV_hgPMeO2bEDxIoYnGf6bx0gbbmzdozZ0NUvRknqwNo/s400/New+Picture+(5).bmp" width="400" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Of course, you may need to add additional namespaces. After that, in the Properties tab of the Xaml page where our control resides, we can set our properties accordingly, using data binding.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Under the Trigger section, you can select the event, in this case Click. If you need to perform extended validation, the Conditions tab can also be used to bind to values of other controls, and based on the value, will enable the command or not. However, turning to the Common Properties section, we can use the Advanced options of the Command property to select the resource, as seen below.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimlyzkM0RtfJcfXazusta3a8s0517b0StI8mOqBlFeSX7F3bh3W3eVoNwuz8CMnRYS9KiyCbnDgx3lAwkwfTO9VwYKb-rZehB5uR4e36C0JrcEk9E8xwvjeT3p6XItMCFMiaxNyZhLJb4/s1600/New+Picture+(6).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimlyzkM0RtfJcfXazusta3a8s0517b0StI8mOqBlFeSX7F3bh3W3eVoNwuz8CMnRYS9KiyCbnDgx3lAwkwfTO9VwYKb-rZehB5uR4e36C0JrcEk9E8xwvjeT3p6XItMCFMiaxNyZhLJb4/s400/New+Picture+(6).bmp" width="263" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;">Since, in this case, I want to close our "window" of content, I need some way to tell the close command which UIElement is actually being clicked on and closed. We can accomplish this by selecting Advanced options of the CommandParameter property and selecting "Element Property Binding..." This will change our cursor to be a mouse with a little target, and from there we can use the "Objects and Timeline" tab to select the root element, in my case "userControl".</span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ3v_afPbpcoviqrJn4U8IF-1tk1c_oDRw1w07IxO3bD6D7xwxV75qj9m3dgJivyjVFjCXvW5W-61ZBYL7ubdATMmYL0gmSW_Vv75NXh_l4yOCw9vcEcON45obgVOfZJlUCAUjrd4lpog/s1600/New+Picture+(7).bmp" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ3v_afPbpcoviqrJn4U8IF-1tk1c_oDRw1w07IxO3bD6D7xwxV75qj9m3dgJivyjVFjCXvW5W-61ZBYL7ubdATMmYL0gmSW_Vv75NXh_l4yOCw9vcEcON45obgVOfZJlUCAUjrd4lpog/s640/New+Picture+(7).bmp" width="260" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCBtI0NpnWpdmPLRDxVpksgDh2pljh1RJ12nQ6L9Cc_mfSKW394jpEvBR5ZDMkhlPEbCN2y5PPU8ITQp580IMWG3UTF9uFllvT4WfkWITKV7JkopGmsoC0HxINougEl94M1BkSylyX9cw/s1600/New+Picture+(8).bmp" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><img border="0" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCBtI0NpnWpdmPLRDxVpksgDh2pljh1RJ12nQ6L9Cc_mfSKW394jpEvBR5ZDMkhlPEbCN2y5PPU8ITQp580IMWG3UTF9uFllvT4WfkWITKV7JkopGmsoC0HxINougEl94M1BkSylyX9cw/s320/New+Picture+(8).bmp" width="320" /></span></span></a></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><br />
</span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">The final step is to add the CommandName, in the case Execute. And there you have it. Your data binding and behavior control is ready to run.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">If you liked this post, please forward it on or comment.</span></span></div><div><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://msdn.microsoft.com/en-us/library/ms752347.aspx"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Data Binding</span></span></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://msdn.microsoft.com/en-us/library/ff724018(Expression.40).aspx"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">InvokeCommandAction</span></span></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.usercontrol(VS.95).aspx"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">UserControl</span></span></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.buttonbase.click(VS.95).aspx"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Click</span></span></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://www.silverlight.net/"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Silverlight</span></span></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://mef.codeplex.com/"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">MEF</span></span></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://www.microsoft.com/expression/products/blend_overview.aspx"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Blend 4</span></span></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://www.microsoft.com/visualstudio/en-us/"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">Visual Studio 2010</span></span></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;"><br />
</span></span></div><div><a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx"><span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><span class="Apple-style-span" style="font-size: small;">ICommand</span></span></a></div>Matt Robinsonhttp://www.blogger.com/profile/18135815064583382099noreply@blogger.com