<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.devexpress.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">eXpress App Framework Team</title><subtitle type="html" /><id>http://community.devexpress.com/blogs/eaf/atom.aspx</id><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/default.aspx" /><link rel="self" type="application/atom+xml" href="http://community.devexpress.com/blogs/eaf/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.30415.43">Community Server</generator><updated>2011-08-22T16:10:00Z</updated><entry><title>Take a tour of DXv2: XAF Q&amp;A</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/12/28/take-a-tour-of-dxv2-xaf.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/12/28/take-a-tour-of-dxv2-xaf.aspx</id><published>2011-12-28T02:25:00Z</published><updated>2011-12-28T02:25:00Z</updated><content type="html">&lt;p align="justify"&gt;A bit late with this post,…but&lt;/p&gt;  &lt;p align="justify"&gt;Check out the &lt;a href="http://www.youtube.com/watch?v=M9L5n1UQNwg"&gt;&amp;quot;Take a tour of DXv2: XAF”&lt;/a&gt; webinar as well as the &lt;a href="http://www.youtube.com/watch?&amp;amp;v=I3BXBoRsKJg"&gt;&amp;quot;XAF - Application Server &amp;amp; Improved Security System&amp;quot;&lt;/a&gt; tutorial videos to get started with the newest version of the &lt;a href="http://www.devexpress.com/Subscriptions/DXperience/xaf-features.xml"&gt;eXpressApp Framework (XAF)&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;And don’t forget to check out the &lt;a href="http://www.devexpress.com/Support/WhatsNew/"&gt;What’s New&lt;/a&gt; pages for both XAF and XPO:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://www.devexpress.com/Subscriptions/DXperience/DXv2/index.xml?page=59"&gt;eXpressApp Framework (XAF)&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://www.devexpress.com/Subscriptions/DXperience/DXv2/index.xml?page=60"&gt;eXpress Persistent Objects (XPO)&lt;/a&gt;. &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Finally, do not miss &lt;a href="http://www.devexpress.com/Support/WhatsNew/DXperience/help/11.2.5/11.2.5.help.xml#autolist11"&gt;the new and updated help articles&lt;/a&gt; for these products located in the &lt;a href="http://www.devexpress.com/Support/WhatsNew/DXperience/help/11.2.5/11.2.5.help.xml"&gt;What’s New in Help&lt;/a&gt; document.&lt;/p&gt;  &lt;p align="justify"&gt;I also wanted to answer a few of the more interesting questions left unanswered from our last webinar. So, here we go:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q:&lt;/strong&gt; What are the main advantages of your application server and the improved security system? Why would one want to use them?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; In our opinion, every serious application for a medium or large enterprise requires a stable and solid security system that will ensure that clients only access data and perform operations they have permissions to. In the most cases, secure data filtering is done in the middle tier, thus preventing the client application from direct database connections. The client application usually connects to the middle tier server via Remoting, WCF or other popular data transport technologies. The middle tier application itself can be run as a console, Windows service application or be hosted as part of a web application on IIS. &lt;/p&gt;  &lt;p align="justify"&gt;As you know, implementing, testing and maintaining even the core of such a system yourself will require enormous resources. Implementing GUI for it will also cost you a lot of time and money. In addition, if you Google the term, you will quickly find that it will require learning both a large number of technologies and numerous patterns &amp;amp; best practices available in papers created by Microsoft and many third-parties…    &lt;br /&gt;    &lt;br /&gt;With XAF you get all of this out-of-the-box and as a result you have a ready GUI + Core that is based on existing DevExpress technologies (we use DevExpress visual components for the UI and XPO for the application server and security core). Finally, note that the XAF security system supports defining permissions on the object type, object instance and member levels, as well as custom permissions. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q:&lt;/strong&gt; What are the main difference between the old and new XAF security systems?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; The new XAF security system prevents client applications from retrieving sensitive data. All permission requests are redirected to the security service located on the application server. Your secure data is much safer now as it will not leave the server. Refer to &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3365"&gt;this help article&lt;/a&gt; explaining these differences in greater detail. In addition, the new security system is accompanied with a more effective UI for editing security permissions – you now have a &lt;a href="http://www.devexpress.com/Subscriptions/DXperience/DXv2/i/xaf-permissions.png"&gt;permissions matrix&lt;/a&gt; that I believe will be welcomed by your clients.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q:&lt;/strong&gt; I am interested in the new application server &amp;amp; security system and just wanted to verify that if a user does not have permissions to an object / field, the respective information will not be displayed in reports, analysis, etc.     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; Of course, it works as you would expect and these features were specially designed for these scenario. Security does restrict data on the server side so that it never appears in reports, analysis and elsewhere on the client side. For more information, check out &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3365"&gt;the work schema&lt;/a&gt;. Note that to obtain all these benefits, you will need to &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3367"&gt;configure security in the middle tier&lt;/a&gt;. Simply using the new security system (without implementing it in the middle tier) will not provide data filtering on the server side, because this is done by the middle tier service.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q:&lt;/strong&gt; Does your new security system allow creating and plugging custom security permissions, i.e. not only permissions for business objects and their members? How do I implement a custom permission?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; Sure, much like the previous version, our new security system allows for this. A good example of a custom permission is “Edit Model&amp;quot; permission. Refer to the following Support Center ticket for a detailed description and a small sample project that demonstrates its implementation: &lt;a href="http://www.devexpress.com/issue=Q358567"&gt;http://www.devexpress.com/issue=Q358567&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q: &lt;/strong&gt;Is it necessary to host the application server on a separate machine as part of a console, Windows service application or a web application on IIS?     &lt;br /&gt;&lt;strong&gt;A: &lt;/strong&gt;No, it is absolutely unnecessary. The application server is a pure NET code that can be run anywhere you need, even on the client application. For instance, in our SecurityDemo, the application server is hosted in the same client application, but in a different &lt;em&gt;AppDomain&lt;/em&gt; (check the &lt;em&gt;ApplicationServerStarter&lt;/em&gt; class for the details). By default, we provide a Visual Studio Project Template that hosts the application server in a Windows service. We plan to provide additional templates based on the customer feedback. If you cannot wait, it is not difficult to make these templates yourself based on the defaults we provide – it is simply a matter of creating a corresponding application type (refer to MSDN for more details) and copying the required application server code.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q:&lt;/strong&gt; Is there a way to encrypt or compress data between the application server and the client?     &lt;br /&gt;&lt;strong&gt;A: &lt;/strong&gt;&lt;span&gt;There is no special XAF encrypting code because everything is already supported by underlying data transport technologies. For instance, refer to the&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-US/library/k62k71x0(v=VS.80).aspx"&gt;http://msdn.microsoft.com/en-US/library/k62k71x0(v=VS.80).aspx&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ms735093.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms735093.aspx&lt;/a&gt; help articles to learn more.&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q:&lt;/strong&gt; Is Application server completely stateless?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; Yes, the application server is stateless. However, the server caches a database session and access rights for a particular client. It&amp;#39;s not a long-living cache and this is not a state for the client application.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q:&lt;/strong&gt; I heard that you are also planning to move some standard XAF functionality (audit trail, validation, etc.) to the server side, what if I also want to execute my business rules on the server? How do I proceed?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; Yes, you are right, we have such plans for the future. In the meantime, if you want to delegate business logic from the client to the server, you can implement a solution similar to that demonstrated in the following Support Center ticket: &lt;a href="http://www.devexpress.com/issue=Q356933"&gt;http://www.devexpress.com/issue=Q356933&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Q:&lt;/strong&gt; Is there an easy and fast way to replace the old security system with new member-level security?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; Yes, we&amp;#39;ll provide a sample converter that can be used to convert old permissions to new permissions for our built-in security objects (User, Role, SecuritySimple, SecurityComplex, etc.). I suggest you check out &lt;a href="http://www.devexpress.com/issue=Q361779"&gt;this discussion in the Support Center&lt;/a&gt; for more information.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; I noticed there were still some postbacks during my Web application operation. Is it a bug?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; No, some tasks can be performed only via postback (e.g. file download, theme changes, etc.). However, we plan enhance our Web UI and you can see our plans in this &lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/10/07/improvements-to-ajax-and-performance-in-xaf-asp-net-ui-coming-in-v2011-vol-2.aspx"&gt;blog&lt;/a&gt; post.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; I like the new AJAX Web UI, but previously I used some custom user and third-party controls that operate via postbacks. Is it possible to force them to use AJAX as well?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; If a third-party control operates via postbacks and does not support AJAX itself, it&amp;#39;s unlikely to switch it into AJAX. However, it will continue to operate via postbacks as before. As for your custom user controls, it is possible to convert them to AJAX-like controls. Please contact our &lt;a href="http://www.devexpress.com/Support/"&gt;Support Team&lt;/a&gt; for further instructions.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What is the best way to convert my existing Web application to 11.2 to use the improved AJAX functionality?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; As always, we recommend that you follow the instructions given in the &lt;a href="http://documentation.devexpress.com/#GeneralInformation/CustomDocument2221"&gt;Upgrade Notes&lt;/a&gt; help article. From this article you can also find links to the list of breaking changes and implemented features. Finally, we suggest you check out the &lt;a href="http://www.devexpress.com/Support/Center/KB/ViewKBIssue.aspx?kbid=K18548"&gt;eXpressApp Framework v11.2 ASP.NET Application Migration Guidelines&lt;/a&gt; we&amp;#39;ve prepared. If you experience any difficulties with the upgrade, feel free to contact our &lt;a href="http://www.devexpress.com/Support/"&gt;Support Team&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Do you provide any converter for rules created using obsolete ConditionalEditorState and ConditionalFormatting modules?     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; Sure, we do. Please refer to the following KB Article: &lt;a href="http://www.devexpress.com/kb=K18547"&gt;http://www.devexpress.com/kb=K18547&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What are your plans for the old security system? I also noticed that not all XAF demos migrated to the new security system.     &lt;br /&gt;&lt;strong&gt;A:&lt;/strong&gt; Yes, that is true about the demos. You might also notice that the old security is still described in docs. We decided not to migrate all demos to the new security system in this release because there are a lot of people who are using the old security and might even use it in the future as it is effective, even though it works at the UI level. However, migrating all our demos to the new security system is planned as well as complete replacement of the old security system. People who are using Domain Components can also &lt;a href="http://www.devexpress.com/issue=S38496"&gt;track this suggestion&lt;/a&gt; – a DC-based demo based on the new security system. &lt;/p&gt;  &lt;p&gt;As always, we will also try to keep new videos, blogs and other training materials coming. If you have specific suggestions or just want to share your feedback on how we are doing, please drop us a line or simply email me at &lt;a href="mailto:dennis@devexpress.com"&gt;dennis@devexpress.com&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Happy XAFing&lt;img class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://community.devexpress.com/blogs/eaf/wlEmoticon-smile_74937379.png" /&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=360519" width="1" height="1"&gt;</content><author><name>Dennis (DevExpress Support)</name><uri>http://community.devexpress.com/members/Dennis-_2800_DevExpress-Support_2900_.aspx</uri></author><category term="11.2" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/11.2/default.aspx" /><category term="XPO" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XPO/default.aspx" /><category term="security" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/security/default.aspx" /><category term="n-tier" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/n-tier/default.aspx" /><category term="middle tier" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/middle+tier/default.aspx" /><category term="application server" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/application+server/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>eXpand on Hanselminutes</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/12/16/expand-on-hanselminutes.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/12/16/expand-on-hanselminutes.aspx</id><published>2011-12-16T05:29:00Z</published><updated>2011-12-16T05:29:00Z</updated><content type="html">&lt;p&gt;First of all I would like to say a big thank you to Scott for having me on his show. I really enjoyed our conversation even though they said I worked for one of our competitors in the intro! &lt;/p&gt;  &lt;p&gt;&lt;a href="http://hanselminutes.com/297/framework-series-the-expand-framework-with-apostolis-bekiaris" target="_blank"&gt;Framework Series: The eXpand Framework with Apostolis Bekiaris&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For those of you who have not had a chance to listen to the show yet Scott and I had an illuminating discussion about the benefits of open source. I found the comments Scott made about Microsoft’s attitude towards these kind of projects particularly revealing. Of course we found plenty of time to chat about eXpand, including some of the history of the project and the important role that our contributors play. It is clear that Scott recognizes the value of a healthy open source community like ours. Also on the agenda&amp;#160; were the advantages of the special relationship between &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt; and eXpand as well as the support that DevExpress gives to the world of open source.&lt;/p&gt;  &lt;p&gt;Thanks again to all of you out there in the community this is your framework and we all deserve a share of the glory!&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=360678" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="eXpandFrameWork" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/eXpandFrameWork/default.aspx" /></entry><entry><title>Hey Mom we are on the Hanselminutes show!</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/12/14/hey-mom-we-are-on-the-hanselminutes-show.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/12/14/hey-mom-we-are-on-the-hanselminutes-show.aspx</id><published>2011-12-14T03:33:00Z</published><updated>2011-12-14T03:33:00Z</updated><content type="html">&lt;p&gt;At 11.00 PST on Thursday 15th December I will be appearing live on Scott Hanselman’s podcast &lt;a href="http://hanselminutes.com/" target="_blank"&gt;Hanselminutes&lt;/a&gt;. During the course of the show Scott and I will be discussing &lt;a href="http://www.expandframework.com" target="_blank"&gt;eXpand framework&lt;/a&gt; and its relationship with &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt;. Please tune in and show some support for your favorite frameworks! We built this thing together guys and this is an exciting event for all of us.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=360590" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="eXpandFrameWork" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/eXpandFrameWork/default.aspx" /></entry><entry><title>You have changes? I have Workflow!</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/12/01/starting-workflows-declaratively-when-object-changes.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/12/01/starting-workflows-declaratively-when-object-changes.aspx</id><published>2011-12-01T03:10:00Z</published><updated>2011-12-01T03:10:00Z</updated><content type="html">&lt;p&gt;&lt;em&gt;&lt;font size="1" face="Arial"&gt;Let me describe for a moment how we at DevExpress work. We build and sell software which means that we only sell and provide support for products that have been built and tested by us! However I am here as a framework evangelist and huge XAF fan. This makes it my duty to spread the word as much as I can and make XAF even bigger. To this end through collaboration within the XAF &lt;a href="http://community.devexpress.com/forums/162.aspx" target="_blank"&gt;community&lt;/a&gt;, we have been building and supporting &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt;. This framework follows XAF to the letter and takes things even further. &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; gets its inspiration from real life situations and bases itself on examples from DevExpress Support Center. &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; is the first open source project based on the DevExpress &lt;/font&gt;&lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpressApp Framework (XAF)&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt;. More info is available at &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;www.expandframework.com&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; and our very existence relies on your efforts! Anyone is welcome to contribute and enjoy the rewards. It is not necessary to be a XAF guru, we can all manage to create a behavior taken from DevExpress &lt;a href="http://search.devexpress.com/?q=XPO+OR+XAF&amp;amp;p=T4|P2|0&amp;amp;d=16" target="_blank"&gt;code central&lt;/a&gt;. Let’s work together to enhance our beloved XAF!&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;WF4 uses a service oriented architecture and as a result any problem can be decoupled into smaller, easily solvable and testable services. XAF uses MVC architecture which, in a sense, is very similar to that used by WF4. We can compare XAF’s controllers to WF4 services. Moreover XAF’s Application does the same job as the WF4 server. The upshot of all this is that users should be able to get the feel of WF4 in no time at all. The XAF workflow module introduces a new layer that makes the already decoupled services aware of our business classes.&amp;#160; After this the sky is the limit and over the next few posts I aim to demonstrate some of what can be achieved. For example the next post will focus on creating an event driven workflow initialization engine.&lt;/p&gt;  &lt;p&gt;To get back to today’s post, we will discuss an implementation that is very decoupled and as a result it has very limited dependencies on other modules. It is worth noting that all XAF’s features are decoupled, persistent objects take on the role of domain mappers.&lt;/p&gt;  &lt;p&gt;Take these requirements; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;an end user needs to be able to input an object type (and or) a property name, &lt;/li&gt;    &lt;li&gt;an object change needs to start the workflow either at client or at sever, &lt;/li&gt;    &lt;li&gt;workflows need to be aware of the object that has changed, its PropertyName and its property OldValue. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;The custom workflow definition&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;We cannot use the default &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt; XpoWorkFlowDefinition class in any way.&amp;#160; This is because there are no fields to store the PropertyName and its OldValue. We should not even derive from the default XpoWorkFlowDefinition because we may face difficulties as this class is used by our workflow server. To cope with this issue it is necessary to create a custom ObjectChangedWorkflow definition as shown.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_125EEED2.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_7431311D.png" width="654" height="404" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;While we are doing this we also need to modify the default xaml of the workflow and add the two more arguments (propertyName, oldValue) as per our requirements.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_282FB841.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_34BD655D.png" width="519" height="210" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Below you can see the UI of this custom workflow definition,&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_1AAE5D55.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_1CBB3651.png" width="786" height="541" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Up to here XAF has made things very straightforward for us. We have designed a normal persistent class to store our data and we have used attributes (&lt;em&gt;PropertyEditorType, DataStourceProperty, TypeConverter etc&lt;/em&gt;) to configure the UI.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Registration of custom workflow definition&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;The next step is to register this custom workflow definition. To help with this task, eXpand, provides the &lt;a href="https://github.com/expand/eXpand/blob/master/Xpand/Xpand.ExpressApp.Modules/Workflow/WorkflowStartService.cs" target="_blank"&gt;WorkflowStartService&amp;lt;T&amp;gt;&lt;/a&gt; where T is the type of workflow. Furthermore for &lt;a href="https://github.com/expand/eXpand/blob/master/Xpand/Xpand.ExpressApp.Modules/Workflow/ObjectChangedWorkflows/ObjectChangedWorkflow.cs" target="_blank"&gt;ObjectChangeWorkflow&lt;/a&gt; definitions the implementation is rather easy since there are no further requirements.&lt;/p&gt;  &lt;div style="background:white;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedWorkflowStartService&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;WorkflowStartService&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedWorkflow&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;gt; {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedWorkflowStartService&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;()&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;TimeSpan&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.FromMinutes(1)) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedWorkflowStartService&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;TimeSpan&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; requestsDetectionPeriod) : &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(requestsDetectionPeriod) { }&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;NeedToStartWorkflow&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;IObjectSpace&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; objectSpace, &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedWorkflow&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; workflow) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;AfterWorkFlowStarted&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;IObjectSpace&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; objectSpace, &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedWorkflow&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; workflow, &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;Guid&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; startWorkflow) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p style="margin:0px;"&gt;&lt;u&gt;&lt;strong&gt;Start workflow - Track Object Changes&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Now, when I have registered workflows on the server, it&amp;#39;s time to return to my task: start a workflow when a property has been changed.    &lt;br /&gt;In XAF, I can track changes with the help of the ObjectSpace.Committing and ObjectSpace.ObjectChanged events. However because we need to create only one request per object change, it is advisable to collect the changes in an array.&lt;/p&gt;  &lt;div style="background:white;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;protected&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;OnActivated&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;() {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;OnActivated&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;();&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;TypeHasWorkflows&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;()) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;ObjectSpace&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#ff00ff"&gt;ObjectChanged&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;+=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;PopulateObjectChangedEventArgs&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;ObjectSpace&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#ff00ff"&gt;Committing&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;+=&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;StartWorkFlows&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;PopulateObjectChangedEventArgs&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; sender, &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedEventArgs&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; objectChangedEventArgs) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (!&lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;IsNullOrEmpty&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(objectChangedEventArgs.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;PropertyName&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;)) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; changedEventArgs = &lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;_objectChangedEventArgses&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;FirstOrDefault&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(args =&amp;gt; args.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;Object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; == objectChangedEventArgs.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;Object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &amp;amp;&amp;amp; args.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;PropertyName&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; == objectChangedEventArgs.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;PropertyName&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;);&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (changedEventArgs != &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;_objectChangedEventArgses&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;Remove&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(changedEventArgs);&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;_objectChangedEventArgses&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;Add&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedEventArgs&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(changedEventArgs.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;Object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, changedEventArgs.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;PropertyName&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, changedEventArgs.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;OldValue&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, objectChangedEventArgs.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;NewValue&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;));&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;_objectChangedEventArgses&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;Add&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(objectChangedEventArgs);&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;StartWorkFlow&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedEventArgs&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; objectChangedEventArgs, &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ObjectChangedWorkflow&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; objectChangedWorkflow) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; o = objectChangedEventArgs.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;Object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ITypeInfo&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; typeInfo = &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;XafTypesInfo&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;Instance&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;FindTypeInfo&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(o.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;GetType&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;());&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; targetObjectKey = typeInfo.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;KeyMember&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;GetValue&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(o);&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (objectChangedWorkflow.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;ExecutionDomain&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; == &lt;/font&gt;&lt;span&gt;&lt;font color="#00008b"&gt;ExecutionDomain&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;span&gt;&lt;font color="#800080"&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;) {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;CreateServerRequest&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(objectChangedEventArgs, objectChangedWorkflow, targetObjectKey, typeInfo);&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; {&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;span&gt;&lt;font color="#008b8b"&gt;InvokeOnClient&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(objectChangedEventArgs, objectChangedWorkflow, targetObjectKey);&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/p&gt; &lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;As you will have noticed we have not used the default VS naming for ObjectSpace event handlers. This is because the names that have chosen give a more specific idea of how each method works.&lt;/div&gt;  &lt;p&gt;The ObjectChanged event occurs each time a property is changed and the changes are collected in the objectChangedEventArgses array. The Committing event occurs once changes are ready to be sent to the server and workflows start for each entry. We have introduced two options for starting and executing workflows;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Execute synchronously and locally, &lt;/li&gt;    &lt;li&gt;Send a request to the server and execute at the server asynchronously      &lt;br /&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Execute a workflow synchronously on the client&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The next stage is to create activities at the client then on ObjectSpace CommitChanges from appropriate WorkflowDefinition and execute them immediatelly&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;     &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StartWorkflowOnObjectChangeController&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;ViewController&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ObjectView&lt;/span&gt;&amp;gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;InvokeOnClient&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;ObjectChangedEventArgs&lt;/span&gt; objectChangedEventArgs, &lt;span style="color:#00008b;"&gt;ObjectChangedWorkflow&lt;/span&gt; objectChangedWorkflow, &lt;span style="color:blue;"&gt;object&lt;/span&gt; targetObjectKey) {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#00008b;"&gt;Activity&lt;/span&gt; activity = &lt;span style="color:#00008b;"&gt;ActivityXamlServices&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;Load&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StringReader&lt;/span&gt;(objectChangedWorkflow.&lt;span style="color:purple;"&gt;Xaml&lt;/span&gt;));&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; dictionary = &lt;span style="color:#00008b;"&gt;ObjectChangedStartWorkflowService&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;Dictionary&lt;/span&gt;(targetObjectKey, objectChangedEventArgs.&lt;span style="color:purple;"&gt;PropertyName&lt;/span&gt;, objectChangedEventArgs.&lt;span style="color:purple;"&gt;OldValue&lt;/span&gt;);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#00008b;"&gt;WorkflowInvoker&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;Invoke&lt;/span&gt;(activity, dictionary);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;   &lt;/div&gt;    &lt;br /&gt;This is a simple code which can be found in nearly any WF4 example at &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=21459"&gt;http://www.microsoft.com/download/en/details.aspx?id=21459&lt;/a&gt;.     &lt;br /&gt;&lt;/div&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Send a request to start workflow on the server&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The second of our two methods involves starting the workflow at the server. Now we need to notify the server of the values of those arguments as well. In the &lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/07/19/manually-starting-workflows.aspx" target="_blank"&gt;manually starting workflows&lt;/a&gt; post we learnt that XAF does this by using XpoStartWorkflowRequest. This class has a different design however, and may create issues since it is used by XAF default services. Therefore instead of deriving from XpoStartWorkflowRequest we need to design a similar custom class.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;     &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ObjectChangedXpoStartWorkflowRequest&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;WFBaseObject&lt;/span&gt;, &lt;span style="color:#00008b;"&gt;IObjectChangedWorkflowRequest&lt;/span&gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;TypeConverter&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;StringToTypeConverter&lt;/span&gt;))]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;Type&lt;/span&gt; &lt;span style="color:purple;"&gt;TargetObjectType&lt;/span&gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:purple;"&gt;_targetObjectType&lt;/span&gt;; } &lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;TargetObjectType&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref&lt;/span&gt; &lt;span style="color:purple;"&gt;_targetObjectType&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IDCStartWorkflowRequest Members&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;TargetWorkflowUniqueId&lt;/span&gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;TargetWorkflowUniqueId&amp;quot;&lt;/span&gt;); } &lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;TargetWorkflowUniqueId&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;ValueConverter&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;KeyConverter&lt;/span&gt;))]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt; &lt;span style="color:purple;"&gt;TargetObjectKey&lt;/span&gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;TargetObjectKey&amp;quot;&lt;/span&gt;); } &lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;TargetObjectKey&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IObjectChangedWorkflowRequest Members&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;PropertyName&lt;/span&gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:purple;"&gt;_propertyName&lt;/span&gt;; } &lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;PropertyName&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref&lt;/span&gt; &lt;span style="color:purple;"&gt;_propertyName&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;ValueConverter&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;SerializableObjectConverter&lt;/span&gt;))]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;Size&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;SizeAttribute&lt;/span&gt;.&lt;span style="color:purple;font-weight:bold;"&gt;Unlimited&lt;/span&gt;)]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt; &lt;span style="color:purple;"&gt;OldValue&lt;/span&gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:purple;"&gt;_oldValue&lt;/span&gt;; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;OldValue&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;ref&lt;/span&gt; &lt;span style="color:purple;"&gt;_oldValue&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This is a very simple class, its only role is to store values in the database. Now instead of invoking workflows locally we only need to create ObjectChangedXpoStartWorkflowRequest objects. &lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StartWorkflowOnObjectChangeController&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;ViewController&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ObjectView&lt;/span&gt;&amp;gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;CreateServerRequest&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;ObjectChangedEventArgs&lt;/span&gt; objectChangedEventArgs, &lt;span style="color:#00008b;"&gt;ObjectChangedWorkflow&lt;/span&gt; objectChangedWorkflow, &lt;span style="color:blue;"&gt;object&lt;/span&gt; targetObjectKey, &lt;span style="color:#00008b;"&gt;ITypeInfo&lt;/span&gt; typeInfo) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; request = &lt;span style="color:purple;"&gt;ObjectSpace&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;CreateObject&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ObjectChangedXpoStartWorkflowRequest&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.&lt;span style="color:purple;"&gt;TargetWorkflowUniqueId&lt;/span&gt; = objectChangedWorkflow.&lt;span style="color:#008b8b;"&gt;GetUniqueId&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.&lt;span style="color:purple;"&gt;TargetObjectType&lt;/span&gt; = typeInfo.&lt;span style="color:purple;"&gt;Type&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.&lt;span style="color:purple;"&gt;TargetObjectKey&lt;/span&gt; = targetObjectKey;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.&lt;span style="color:purple;"&gt;PropertyName&lt;/span&gt; = objectChangedEventArgs.&lt;span style="color:purple;"&gt;PropertyName&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request.&lt;span style="color:purple;"&gt;OldValue&lt;/span&gt; = &lt;span style="color:#008b8b;"&gt;GetOldValue&lt;/span&gt;(objectChangedEventArgs);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;In the next step we are going to create a service to consume these values from the server and start a workflow,&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StartWorkflowOnObjectChangeService&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;BaseTimerService&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;OnTimer&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; objectSpace = &lt;span style="color:purple;"&gt;ObjectSpaceProvider&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;CreateObjectSpace&lt;/span&gt;()) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;//get all requests from the database&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;request&lt;/span&gt; &lt;span style="color:blue;"&gt;in&lt;/span&gt; objectSpace.&lt;span style="color:#008b8b;"&gt;GetObjects&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ObjectChangedXpoStartWorkflowRequest&lt;/span&gt;&amp;gt;()) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;//find workflow&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; definition = &lt;span style="color:#008b8b;"&gt;GetService&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;IWorkflowDefinitionProvider&lt;/span&gt;&amp;gt;().&lt;span style="color:#008b8b;"&gt;FindDefinition&lt;/span&gt;(&lt;span style="font-weight:bold;"&gt;request&lt;/span&gt;.&lt;span style="color:purple;"&gt;TargetWorkflowUniqueId&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (definition != &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; definition.&lt;span style="color:purple;"&gt;CanOpenHost&lt;/span&gt;) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;//Start the workflow passing in PropertyName &amp;amp;&amp;amp; OldValue&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:#008b8b;"&gt;GetService&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ObjectChangedStartWorkflowService&lt;/span&gt;&amp;gt;().&lt;span style="color:#008b8b;"&gt;StartWorkflow&lt;/span&gt;(definition.&lt;span style="color:purple;"&gt;Name&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;"&gt;request&lt;/span&gt;.&lt;span style="color:purple;"&gt;TargetWorkflowUniqueId&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;request&lt;/span&gt;.&lt;span style="color:purple;"&gt;TargetObjectKey&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;request&lt;/span&gt;.&lt;span style="color:purple;"&gt;PropertyName&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;request&lt;/span&gt;.&lt;span style="color:purple;"&gt;OldValue&lt;/span&gt;)) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objectSpace.&lt;span style="color:#008b8b;"&gt;Delete&lt;/span&gt;(&lt;span style="font-weight:bold;"&gt;request&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; objectSpace.&lt;span style="color:#008b8b;"&gt;CommitChanges&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;At this point our server has all the information it needs to start workflows with arguments taken from persistent &lt;a href="https://github.com/expand/eXpand/blob/master/Xpand/Xpand.ExpressApp.Modules/Workflow/ObjectChangedWorkflows/ObjectChangedXpoStartWorkflowRequest.cs" target="_blank"&gt;ObjectChangeXpoStartWorkFlowRequest&lt;/a&gt; objects. &lt;/p&gt;  &lt;p&gt;I must admit that I have fully enjoyed preparing this post. The decoupled development experienced offered by the WF service oriented model is something that really appeals to me. At the same time XAF’s workflow module implementation made modeling the requirements a simple and enjoyable process. As usual it was possible to work directly on the problem and leave the hard work to non XAF developers. &lt;/p&gt;  &lt;p&gt;We are happy to read your feedback about this!. Remember that your questions are the best candidates for future posts &lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=357433" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="WF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/WF/default.aspx" /><category term="eXpandFrameWork" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/eXpandFrameWork/default.aspx" /></entry><entry><title>Access eXpand from the Start menu (coming in v2011 vol 2)</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/10/10/access-expand-from-the-start-menu-coming-in-v2011-vol-2.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/10/10/access-expand-from-the-start-menu-coming-in-v2011-vol-2.aspx</id><published>2011-10-10T01:00:00Z</published><updated>2011-10-10T01:00:00Z</updated><content type="html">&lt;p align="justify"&gt;In the upcoming release of &lt;strong&gt;DXperience v2011 vol 2&lt;/strong&gt;, we have made it easier for new and existing users to discover the great capabilities of our &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/"&gt;eXpressApp Framework&lt;/a&gt; (XAF) via &lt;strong&gt;&lt;a href="http://community.devexpress.com/blogs/www.expandframework.com"&gt;eXpand&lt;/a&gt;&lt;/strong&gt;&amp;nbsp; - the first open source framework built based on the XAF infrastructure and providing extra modules to its developers:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/screenshot_7974174F.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div style="TEXT-ALIGN:center;"&gt;&lt;img style="WIDTH:800px;DISPLAY:block;HEIGHT:397px;MARGIN-LEFT:auto;MARGIN-RIGHT:auto;" title="screenshot" alt="screenshot" src="http://community.devexpress.com/blogs/eaf/screenshot_thumb_0565E1B7.png" width="945" height="470" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p align="justify"&gt;For those who are not yet familiar with eXpand, let me quote a more detailed description from &lt;a href="http://community.devexpress.com/blogs/www.expandframework.com"&gt;their web site&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;: &lt;/p&gt;
&lt;p align="justify"&gt;&lt;em&gt;&lt;span style="COLOR:#0000ff;"&gt;“…The eXpand Framework team have extended the capabilities of the eXpressApp Framework to include &lt;strong&gt;57 cutting-edge assemblies containing tools and modules that target numerous business scenarios&lt;/strong&gt;. The main idea behind eXpand is to offer as many features as possible to developers/business users through a declarative approach (configuring files rather than writing code). Please go through each of the following brief descriptions and find out how &lt;strong&gt;eXpand can help you accomplish your complex development tasks with easy declarative programming&lt;/strong&gt;…”&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p align="justify"&gt;I hope that you were pleased by this news too. Please let us know in comments to this blog.&lt;/p&gt;
&lt;p align="justify"&gt;Happy XAFing&lt;img style="BORDER-BOTTOM-STYLE:none;BORDER-LEFT-STYLE:none;BORDER-TOP-STYLE:none;BORDER-RIGHT-STYLE:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://community.devexpress.com/blogs/eaf/wlEmoticon-winkingsmile_02044A0F.png" /&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=356468" width="1" height="1"&gt;</content><author><name>Dennis (DevExpress Support)</name><uri>http://community.devexpress.com/members/Dennis-_2800_DevExpress-Support_2900_.aspx</uri></author><category term="eXpandFrameWork" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/eXpandFrameWork/default.aspx" /><category term="11.2" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/11.2/default.aspx" /><category term="expand" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/expand/default.aspx" /></entry><entry><title>Improvements to AJAX and Performance in XAF ASP.NET UI (coming in v2011 vol 2)</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/10/07/improvements-to-ajax-and-performance-in-xaf-asp-net-ui-coming-in-v2011-vol-2.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/10/07/improvements-to-ajax-and-performance-in-xaf-asp-net-ui-coming-in-v2011-vol-2.aspx</id><published>2011-10-07T05:40:00Z</published><updated>2011-10-07T05:40:00Z</updated><content type="html">&lt;p align="justify"&gt;Recently I sat down with a few members of our &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/"&gt;eXpressApp Framework Team&lt;/a&gt; to discuss some of the features we&amp;#39;ll introduce in the upcoming release of &lt;strong&gt;DXperience v2011 vol 2&lt;/strong&gt;. Here are Serge K, &lt;em&gt;Leo K &lt;span style="text-decoration:line-through;"&gt;DiCaprio&lt;/span&gt;&lt;/em&gt;&amp;#160; and Dmitry S in their own words...&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/HolyXAF3_47DA8B42.png"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" title="HolyXAF3" alt="HolyXAF3" src="http://community.devexpress.com/blogs/eaf/HolyXAF3_thumb_62372C01.png" width="600" height="441" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;Q: Guys, briefly describe what you have achieved in this release.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;A: &lt;/strong&gt;XAF ASP.NET applications now use &lt;strong&gt;AJAX-based rendering &lt;/strong&gt;for nearly everything. This means that only small modified elements of the web page markup are sent from the web server to the client’s web browser via callbacks. Thus, the web page is now updated &lt;strong&gt;smoothly&lt;/strong&gt;. If a part of the page is static, there is no need to render it by the web server on each HTTP request and send its markup to the client.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;Q: How will these improvements affect performance and traffic?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;A:&lt;/strong&gt; &lt;span style="font-family:&amp;#39;Verdana&amp;#39;, &amp;#39;sans-serif&amp;#39;;font-size:8pt;mso-ansi-language:en;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:ru;mso-bidi-font-weight:bold;mso-bidi-font-style:italic;"&gt;&lt;span style="color:#000000;"&gt;Actually “performance” is a very broad term and there are a lot of metrics to measure it&lt;strong&gt;. &lt;/strong&gt;Let’s address some web request-response cycle steps affected by our improvements. As you know, every web request takes time to connect to the web server, to send a request data to the server, to process this request, to render a result, to send this result to a browser, to render the received HTML in the browser, to process startup JavaScript and after that an end-user can interact with the page again. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;, &amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/04/20/xaf-improved-asp-net-ui-performance-coming-in-v2011-vol-1.aspx"&gt;Previously&lt;/a&gt;&lt;span style="mso-ansi-language:en;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:ru;mso-bidi-font-weight:bold;mso-bidi-font-style:italic;"&gt;&lt;span style="text-decoration:underline;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;, &amp;#39;sans-serif&amp;#39;;font-size:8pt;mso-ansi-language:en;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:ru;mso-bidi-font-weight:bold;mso-bidi-font-style:italic;"&gt; we reduced the “process-request” time in the described cycle. We have now improved the other aspects. W&lt;/span&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;, &amp;#39;sans-serif&amp;#39;;font-size:8pt;mso-ansi-language:en;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:ru;mso-bidi-font-style:italic;"&gt;eb applications now produce about &lt;strong style="mso-bidi-font-weight:normal;"&gt;25% less HTTP requests&lt;/strong&gt; than before. In other words, since the web server can now render only small portions of the page and not the&lt;span style="mso-spacerun:yes;"&gt; &lt;/span&gt;whole thing, it can allocate &lt;strong&gt;¼&lt;/strong&gt; of its work time to better serve other users requests. Based on measurements, the web server now produces &lt;strong&gt;3 times less HTML markup, &lt;/strong&gt;which can also be transported &lt;strong&gt;3 times faster&lt;/strong&gt; through the wire (these numbers may vary depending on the end application UI). It is also important to note that now the first request is processed much faster, and an end-user can start interacting with the page before the&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&lt;/span&gt;startup view is fully loaded. Also, web browser now executes common startup Java Script code only once when you open the application’s startup page.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;Q: I presume it significantly improves the overall usability? In other words, what does it mean for end-users?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;A: &lt;/strong&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;, &amp;#39;sans-serif&amp;#39;;font-size:8pt;mso-ansi-language:en;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:ru;"&gt;&lt;span style="color:#000000;"&gt;Of course, end-users will love these enhancements because the application is now more responsive and performs smoot&lt;/span&gt;&lt;a name="_GoBack"&gt;&lt;/a&gt;&lt;span style="color:#000000;"&gt;hly. For instance, imagine that you have a detail form with payment info and want to calculate its amount&amp;#160; based on some rate and man hour values. When you change these values, the amount should be automatically updated. This now works much more smoothly, without any reloads of the page. Our measurements showed that in &lt;strong&gt;v2011 vol 2&lt;/strong&gt; the same scenario can be&lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&lt;/span&gt;performed &lt;strong&gt;1.5 times faster than before&lt;/strong&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;, &amp;#39;sans-serif&amp;#39;;font-size:8pt;mso-ansi-language:en;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-fareast-language:ru;"&gt;&lt;span style="color:#000000;"&gt;Another nice addition, which is worth mentioning here, is that while working on this feature we overcame previous limitations preventing the web browser’s &lt;strong&gt;Back and Forward&lt;/strong&gt; &lt;strong&gt;buttons&lt;/strong&gt; from functioning correctly under certain circumstances. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="color:#0000ff;"&gt;Q: What do you plan to change or improve in future versions of the XAF ASP.NET?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;A&lt;/strong&gt;: First and foremost improvement will continue in the area of &lt;strong&gt;performance&lt;/strong&gt;. As you know, we have been committed to improving overall application performance through our latest releases (&lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/04/20/xaf-improved-asp-net-ui-performance-coming-in-v2011-vol-1.aspx"&gt;one&lt;/a&gt;, &lt;a href="http://community.devexpress.com/blogs/garyshort/archive/2010/12/23/xaf-web-applications-lightweight-rendering-mode.aspx"&gt;two&lt;/a&gt;, &lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/04/28/xaf-core-amp-performance-improvements-coming-in-v2011-vol1.aspx"&gt;three&lt;/a&gt;). That has allowed us to drastically reduce web page size and the number of requests sent to the web server&amp;#160; (and hence overall traffic). We are confident that we have not yet pushed it to its limit and we believe we can continue our optimizations in future versions. &lt;/p&gt;  &lt;p align="justify"&gt;There are also a couple of other interesting new features from our backlog worth mentioning: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Implement simpler and more user-friendly URLs for XAF Views;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Replace standard web browser popup windows with the &lt;a href="http://www.devexpress.com/Products/NET/Controls/ASP/ASPxperience/i/gallery/popup-resizing.png"&gt;ASPxPopupControl&lt;/a&gt;.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;These are the most popular requests related to ASP.NET UI improvement from our customers. &lt;/p&gt;  &lt;h3 align="justify"&gt;Demonstration&lt;/h3&gt;  &lt;p align="justify"&gt;The team prepared &lt;a href="http://community.devexpress.com/blogs/eaf/MainDemo.Web_11.2.swf"&gt;a short video&lt;/a&gt; demonstrating how the &lt;strong&gt;MainDemo.Web&lt;/strong&gt; application shipped with XAF operates in &lt;strong&gt;v2011 vol 2&lt;/strong&gt; (the video is large, so you may want to right-click and choose the &lt;strong&gt;“Show All”&lt;/strong&gt; option):&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt; &lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100%" height="600" id="movie_name" align="middle"&gt;     &lt;param name="movie" value="http://community.devexpress.com/blogs/eaf/MainDemo.Web_11.2.swf" /&gt;     --&amp;gt;     &lt;object data="http://community.devexpress.com/blogs/eaf/MainDemo.Web_11.2.swf" width="100%" height="600"&gt;         &lt;param name="movie" value="http://community.devexpress.com/blogs/eaf/MainDemo.Web_11.2.swf" /&gt;              &lt;a href="http://www.adobe.com/go/getflash"&gt;             &lt;img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /&gt;         &lt;/a&gt;     --&amp;gt;     &lt;/object&gt;      &lt;/object&gt;  &lt;p align="justify"&gt;Do you like what you have read or seen? Please let us known. You input is greatly appreciated!&lt;/p&gt;  &lt;p align="justify"&gt;Happy XAFing&lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://community.devexpress.com/blogs/eaf/wlEmoticon-winkingsmile_2512A11B.png" /&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=355427" width="1" height="1"&gt;</content><author><name>Dennis (DevExpress Support)</name><uri>http://community.devexpress.com/members/Dennis-_2800_DevExpress-Support_2900_.aspx</uri></author><category term="Usability" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/Usability/default.aspx" /><category term="Performance" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/Performance/default.aspx" /><category term="11.2" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/11.2/default.aspx" /><category term="ASP.NET" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/ASP.NET/default.aspx" /><category term="Web" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/Web/default.aspx" /><category term="AJAX" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/AJAX/default.aspx" /><category term="speed" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/speed/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>Creating a State Machine module for eXpand Framework–Part 2</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/09/21/creating-a-state-machine-module-for-expandframework-part-2.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/09/21/creating-a-state-machine-module-for-expandframework-part-2.aspx</id><published>2011-09-21T11:38:00Z</published><updated>2011-09-21T11:38:00Z</updated><content type="html">&lt;p&gt;&lt;em&gt;&lt;font size="1" face="Arial"&gt;Let me describe for a moment how we at DevExpress work. We build and sell software which means that we only sell and provide support for products that have been built and tested by us! However I am here as a framework evangelist and huge XAF fan. This makes it my duty to spread the word as much as I can and make XAF even bigger. To this end through collaboration within the XAF &lt;a href="http://community.devexpress.com/forums/162.aspx" target="_blank"&gt;community&lt;/a&gt;, we have been building and supporting &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt;. This framework follows XAF to the letter and takes things even further. &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; gets its inspiration from real life situations and bases itself on examples from DevExpress Support Center. &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; is the first open source project based on the DevExpress &lt;/font&gt;&lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpressApp Framework (XAF)&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt;. More info is available at &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;www.expandframework.com&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; and our very existence relies on your efforts! Anyone is welcome to contribute and enjoy the rewards. It is not necessary to be a XAF guru, we can all manage to create a behavior taken from DevExpress &lt;a href="http://search.devexpress.com/?q=XPO+OR+XAF&amp;amp;p=T4|P2|0&amp;amp;d=16" target="_blank"&gt;code central&lt;/a&gt;. Let’s work together to enhance our beloved XAF!&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/u&gt;     &lt;br /&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/08/08/creating-a-state-machine-module-for-expandframework-part-1.aspx" target="_blank"&gt;Part 1&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In this post we are going to enhance the State Machine module UI. Remember that along with all the usual &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt; goodies we can now use Xpand code base which gives us a lot more options. Our StateMachineTransitionPermission has 2 lookups, StateMachineName and StateMachine. Our goal is to populate both of these cascading lookups without creating a platform specific module.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;StateMachineNames&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Creating lookups is a common scenario for which Xpand provides a set of property editors and controllers. By contrast with other business frameworks XAF allows maximum flexibility. Therefore in most cases we are able to code in such a generic way that everything could live in separate frameworks such as eXpand. Now, in order to populate the StateMachine name I am going to derive a new controller from a specialized abstract controller which is Xpand.ExpressApp.SystemModule.PopulateController&amp;lt;T&amp;gt;. This controller uses the &lt;a href="http://documentation.devexpress.com/#Xaf/DevExpressExpressAppModelIModelCommonMemberViewItem_PredefinedValuestopic" target="_blank"&gt;PredefinedValues&lt;/a&gt; attribute of the XAF model. When filling the attribute with a set of values separated by semicolons XAF will create a lookup with these values targeting each supported platform.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_00AB8EA3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_50A13D21.png" width="637" height="192" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;However, if at runtime we set the value of the PredefinedValues attribute this will be written at model’s lastlayer and it will make it dirty. We want to avoid this because we want to leave the lastlayer intact.. To cater for this need the populate controller uses a hack. First it stores the lastlayer in a variable then removes it from the model’s layers collection. As a result it is possible to modify the new lastlayer as shown in the Populate method and then return the clean old one to its place. Now the model has all the necessary information with a clean userdiffs layer and while XAF is creating a new view can get the PredefinedValues string from it and create the lookups. &lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;PopulateController&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;T&lt;/span&gt;&amp;gt; : &lt;span style="color:#00008b;"&gt;ViewController&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ObjectView&lt;/span&gt;&amp;gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;…&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; …&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;    &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;     &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;Populate&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;IModelMember&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; collect) {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; name = &lt;span style="color:purple;"&gt;PropertyName&lt;/span&gt;;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (name != &lt;span style="color:blue;"&gt;null&lt;/span&gt;) {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; model = ((&lt;span style="color:#00008b;"&gt;ModelApplicationBase&lt;/span&gt;)&lt;span style="color:purple;"&gt;Application&lt;/span&gt;.&lt;span style="color:purple;"&gt;Model&lt;/span&gt;);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; lastLayer = model.&lt;span style="color:purple;"&gt;LastLayer&lt;/span&gt;;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; model.&lt;span style="color:#008b8b;"&gt;RemoveLayer&lt;/span&gt;(lastLayer);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008b8b;"&gt;PopulateCore&lt;/span&gt;(collect, name);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; model.&lt;span style="color:#008b8b;"&gt;AddLayer&lt;/span&gt;(lastLayer);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;PopulateCore&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;IModelMember&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; collect, &lt;span style="color:blue;"&gt;string&lt;/span&gt; propertyName) {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#00008b;"&gt;IModelMember&lt;/span&gt; modelMember = &lt;span style="color:purple;"&gt;View&lt;/span&gt;.&lt;span style="color:purple;"&gt;Model&lt;/span&gt;.&lt;span style="color:purple;"&gt;ModelClass&lt;/span&gt;.&lt;span style="color:purple;"&gt;AllMembers&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;FirstOrDefault&lt;/span&gt;(member =&amp;gt; member.&lt;span style="color:purple;"&gt;Name&lt;/span&gt; == propertyName);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (modelMember != &lt;span style="color:blue;"&gt;null&lt;/span&gt;) {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; modelMember.&lt;span style="color:purple;"&gt;PredefinedValues&lt;/span&gt; = collect.&lt;span style="color:#008b8b;"&gt;Invoke&lt;/span&gt;(modelMember);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/div&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; …&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; …&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; Although this seems like a complicated explanation users need not be intimidated! The implementation of our controller that will populate all StateMachineNames is as simple as this,     &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;     &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StateMachinePopulateController&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;PopulateController&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;StateMachineTransitionPermission&lt;/span&gt;&amp;gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPredefinedValues&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;IModelMember&lt;/span&gt; wrapper) {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#00008b;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;XpoStateMachine&lt;/span&gt;&amp;gt; xpoStateMachines = &lt;span style="color:purple;"&gt;ObjectSpace&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;GetObjects&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;XpoStateMachine&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; xpoStateMachines.&lt;span style="color:#008b8b;"&gt;Select&lt;/span&gt;(machine =&amp;gt; machine.&lt;span style="color:purple;"&gt;Name&lt;/span&gt;).&lt;span style="color:#008b8b;"&gt;AggregateWith&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;;&amp;quot;&lt;/span&gt;);&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:#00008b;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;StateMachineTransitionPermission&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; &lt;span style="color:#008b8b;"&gt;GetPropertyName&lt;/span&gt;() {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; permission =&amp;gt; permission.&lt;span style="color:purple;"&gt;StateMachineName&lt;/span&gt;;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;}&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;The first thing we did was to provide the propertyName in the GetPropertyName method. Then using the GetPredifinedalues method we return the semincolon delimited string with the machine names. This very simple controller is capable of populating the statemachine lookup for win and web platforms!.&lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;&amp;#160;&lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;&lt;u&gt;StateCaptions&lt;/u&gt;&lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;&lt;u&gt;&lt;/u&gt;&lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;This is a cascading lookup and as a result when the current StateMachineName changes it needs to provide a list of all its StateCaptions. To this end we are going to use a specialized property editor, Xpand’s StringLookupEditor. This supports the &lt;a href="http://documentation.devexpress.com/#Xaf/clsDevExpressPersistentBaseDataSourcePropertyAttributetopic" target="_blank"&gt;DataSourceProperty&lt;/a&gt; XAF attribute which will be used to provide the StateCaption collection. Moreover when using Xpand it is possible to mark editors with an interface and host it in a transparent module. We can then use the Xpand PropertyEditor attribute with the type of the interface as parameter to tell XAF which propertyeditor will be created at runtime. Finally we need to apply all these along with an ImmediatePostData to the StateMachineName property. The permission will look like this,&lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;&amp;#160;&lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;     &lt;p style="margin:0px;"&gt;[&lt;span style="color:#00008b;"&gt;ImmediatePostData&lt;/span&gt;]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;StateMachineName&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt;; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt;; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//IStringLookupPropertyEditor lives in Xpand.ExpressApp assembly&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//Xpand.ExpressApp.Web.PropertyEditors.StringLookupPropertyEditor, Xpand.ExpressApp.Win.PropertyEditors.StringLookupPropertyEditor inherit from IStringLookupPropertyEditor&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;[&lt;span style="color:#00008b;"&gt;PropertyEditor&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;IStringLookupPropertyEditor&lt;/span&gt;))]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;[&lt;span style="color:#00008b;"&gt;DataSourceProperty&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;StateCaptions&amp;quot;&lt;/span&gt;)]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;StateCaption&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt;; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt;; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;       &lt;p style="margin:0px;"&gt;&lt;span style="color:#00008b;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; &lt;span style="color:purple;"&gt;_stateCaptions&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;        &lt;p style="margin:0px;"&gt;[&lt;span style="color:#00008b;"&gt;Browsable&lt;/span&gt;(&lt;span style="color:blue;"&gt;false&lt;/span&gt;)]&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; &lt;span style="color:purple;"&gt;StateCaptions&lt;/span&gt; {&lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; {&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:purple;"&gt;_stateCaptions&lt;/span&gt;;}}&lt;/p&gt;     &lt;/div&gt;   &lt;/div&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;If you look carefully at this code however you may notice that _&lt;span style="color:purple;"&gt;_stateCaptions &lt;/span&gt;count is always zero. Let me remind you here that the StateMachineTransitionPermission is a non persistent sessionless object. This means that the object is not handled by an ObjectSpace therefore a call like ObjectSpace.FindObjectSpaceByObject(this) will always return null. In addition the permission does not implement INotifyPropertyChanged so we need to synchronize the class just before the &lt;span style="color:purple;"&gt;StateCaptions&lt;/span&gt; are requested. Below you can see a modified version of the StateMachinePopulateController,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;     &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;       &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StateMachinePopulateController&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;PopulateController&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;StateMachineTransitionPermission&lt;/span&gt;&amp;gt; {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;OnViewControlsCreated&lt;/span&gt;() {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;base&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;OnViewControlsCreated&lt;/span&gt;();&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; stringLookupPropertyEditor = &lt;span style="color:#008b8b;"&gt;GetPropertyEditor&lt;/span&gt;(permission =&amp;gt; permission.&lt;span style="color:purple;"&gt;StateCaption&lt;/span&gt;) &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#00008b;"&gt;IStringLookupPropertyEditor&lt;/span&gt;;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (stringLookupPropertyEditor != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stringLookupPropertyEditor.&lt;span style="color:fuchsia;"&gt;ItemsCalculating&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;+=&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;StringLookupPropertyEditorOnItemsCalculating&lt;/span&gt;;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;StringLookupPropertyEditorOnItemsCalculating&lt;/span&gt;(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#00008b;"&gt;HandledEventArgs&lt;/span&gt; handledEventArgs) {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; propertyEditor = &lt;span style="color:#008b8b;"&gt;GetPropertyEditor&lt;/span&gt;(permission =&amp;gt; permission.&lt;span style="color:purple;"&gt;StateMachineName&lt;/span&gt;);&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (propertyEditor != &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color:purple;"&gt;View&lt;/span&gt;.&lt;span style="color:purple;"&gt;IsControlCreated&lt;/span&gt;) {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; stateMachineTransitionPermission = ((&lt;span style="color:#00008b;"&gt;StateMachineTransitionPermission&lt;/span&gt;)&lt;span style="color:purple;"&gt;View&lt;/span&gt;.&lt;span style="color:purple;"&gt;CurrentObject&lt;/span&gt;);&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; readOnlyCollection = &lt;span style="color:#008b8b;"&gt;GetStateCaptions&lt;/span&gt;(propertyEditor);&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stateMachineTransitionPermission.&lt;span style="color:#008b8b;"&gt;SyncStateCaptions&lt;/span&gt;(readOnlyCollection, propertyEditor.&lt;span style="color:purple;"&gt;ControlValue&lt;/span&gt; &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt;);&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#00008b;"&gt;ReadOnlyCollection&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; &lt;span style="color:#008b8b;"&gt;GetStateCaptions&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;PropertyEditor&lt;/span&gt; propertyEditor) {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; stateMachineName = propertyEditor.&lt;span style="color:purple;"&gt;ControlValue&lt;/span&gt; &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt;;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:purple;"&gt;ObjectSpace&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;GetObjects&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;XpoState&lt;/span&gt;&amp;gt;(state =&amp;gt; state.&lt;span style="color:purple;"&gt;StateMachine&lt;/span&gt;.&lt;span style="color:purple;"&gt;Name&lt;/span&gt; == stateMachineName).&lt;span style="color:#008b8b;"&gt;Select&lt;/span&gt;(&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; state =&amp;gt; state.&lt;span style="color:purple;"&gt;Caption&lt;/span&gt;).&lt;span style="color:#008b8b;"&gt;ToList&lt;/span&gt;().&lt;span style="color:#008b8b;"&gt;AsReadOnly&lt;/span&gt;();&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;     &lt;/div&gt;   &lt;/div&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;Finally we add the new &lt;span style="color:#008b8b;"&gt;SyncStateCaptions &lt;/span&gt;method and the full version of the permission will be,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;     &lt;p style="margin:0px;"&gt;[&lt;span style="color:#00008b;"&gt;NonPersistent&lt;/span&gt;]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StateMachineTransitionPermission&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;PermissionBase&lt;/span&gt; {&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; …&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; …&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;ImmediatePostData&lt;/span&gt;]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;StateMachineName&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt;; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt;; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;PropertyEditor&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;IStringLookupPropertyEditor&lt;/span&gt;))]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;DataSourceProperty&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;StateCaptions&amp;quot;&lt;/span&gt;)]&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;StateCaption&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt;; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt;; }&lt;/p&gt;      &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;      &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;       &lt;p style="margin:0px;"&gt;&lt;span style="color:#00008b;"&gt;&amp;#160;&amp;#160;&amp;#160; IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; &lt;span style="color:purple;"&gt;_stateCaptions&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;Browsable&lt;/span&gt;(&lt;span style="color:blue;"&gt;false&lt;/span&gt;)]&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; &lt;span style="color:purple;"&gt;StateCaptions&lt;/span&gt; {&lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; {&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:purple;"&gt;_stateCaptions&lt;/span&gt;;}}&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;SyncStateCaptions&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; stateCaptions, &lt;span style="color:blue;"&gt;string&lt;/span&gt; machineName) {&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:purple;"&gt;StateMachineName&lt;/span&gt; = machineName;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:purple;"&gt;_stateCaptions&lt;/span&gt; = stateCaptions;&lt;/p&gt;        &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;     &lt;/div&gt;      &lt;p style="margin:0px;"&gt;}&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;To support platform independent cascading lookups we wrote only about 10 lines of code! This is proof of how much XAF architecture cuts down on development costs. The module can be downloaded from the Xpand &lt;a target="_blank"&gt;download page&lt;/a&gt;&amp;#160;&amp;#160; and we are happy to hear your feedback. Remember that your questions are the best candidates for future posts!&lt;/p&gt;  &lt;p&gt;&lt;iframe style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" height="360" src="http://tv.devexpress.com/embed.aspx?friendlyId=XAFStateMachineModule&amp;amp;autostart=false" width="640" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=353507" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="state machine" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/state+machine/default.aspx" /><category term="eXpandFrameWork" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/eXpandFrameWork/default.aspx" /><category term="editors" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/editors/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>eXpand Framework calculated members creation—Pros and Cons</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/09/20/expandframework-calculated-members-creation-pros-and-cons.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/09/20/expandframework-calculated-members-creation-pros-and-cons.aspx</id><published>2011-09-20T02:54:00Z</published><updated>2011-09-20T02:54:00Z</updated><content type="html">&lt;p&gt;&lt;em&gt;&lt;font size="1" face="Arial"&gt;Let me describe for a moment how we at DevExpress work. We build and sell software which means that we only sell and provide support for products that have been built and tested by us! However I am here as a framework evangelist and huge XAF fan. This makes it my duty to spread the word as much as I can and make XAF even bigger. To this end through collaboration within the XAF &lt;a href="http://community.devexpress.com/forums/162.aspx" target="_blank"&gt;community&lt;/a&gt;, we have been building and supporting &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt;. This framework follows XAF to the letter and takes things even further. &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; gets its inspiration from real life situations and bases itself on examples from DevExpress Support Center. &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; is the first open source project based on the DevExpress &lt;/font&gt;&lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpressApp Framework (XAF)&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt;. More info is available at &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;www.expandframework.com&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; and our very existence relies on your efforts! Anyone is welcome to contribute and enjoy the rewards. It is not necessary to be a XAF guru, we can all manage to create a behavior taken from DevExpress &lt;a href="http://search.devexpress.com/?q=XPO+OR+XAF&amp;amp;p=T4|P2|0&amp;amp;d=16" target="_blank"&gt;code central&lt;/a&gt;. Let’s work together to enhance our beloved XAF!&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;As promised in the previous post I will now attempt to provide a concise yet comprehensive look at the 5 possibilities that Xpand gives us when we want to create a calculated member. I will also provide discussion of the relative advantages and disadvantages of each approach. We can see all of them in action in Xpand FeatureCenter application. Remember it is only thanks to the fact that XAF/XPO have such a strong and flexible architecture that this is possible! We must also acknowledge that these approaches have evolved as a direct result of contributions from the XAF team and community.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_75C957DD.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_5B1CBBC4.png" width="283" height="358" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;1. &lt;u&gt;The XPO way –&amp;gt;Using Code &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Take a look at the CreateCalculabeMember extension method in the code below,&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;CreateRuntimeCalculatedFieldController&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;ViewController&lt;/span&gt; {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160; public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;CustomizeTypesInfo&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;DevExpress&lt;/span&gt;.&lt;span style="color:#00008b;"&gt;ExpressApp&lt;/span&gt;.&lt;span style="color:#00008b;"&gt;DC&lt;/span&gt;.&lt;span style="color:#00008b;"&gt;ITypesInfo&lt;/span&gt; typesInfo) {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; base&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;CustomizeTypesInfo&lt;/span&gt;(typesInfo);&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:#00008b;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XPClassInfo&lt;/span&gt; classInfo = &lt;span style="color:#00008b;"&gt;XafTypesInfo&lt;/span&gt;.&lt;span style="color:purple;"&gt;XpoTypeInfoSource&lt;/span&gt;.&lt;span style="color:purple;"&gt;XPDictionary&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;GetClassInfo&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;Customer&lt;/span&gt;));&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if&lt;/span&gt; (classInfo.&lt;span style="color:#008b8b;"&gt;FindMember&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;SumOfOrderTotals&amp;quot;&lt;/span&gt;)==&lt;span style="color:blue;"&gt;null&lt;/span&gt;) {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var&lt;/span&gt; attributes = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;Attribute&lt;/span&gt;[] {&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;PersistentAliasAttribute&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Orders.Sum(Total)&amp;quot;&lt;/span&gt;)};&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:#00008b;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XPCustomMemberInfo&lt;/span&gt; calculabeMember = classInfo.&lt;span style="color:#008b8b;"&gt;CreateCalculabeMember&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;SumOfOrderTotals&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:blue;"&gt;float&lt;/span&gt;), attributes);&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typesInfo.&lt;span style="color:#008b8b;"&gt;RefreshInfo&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;Customer&lt;/span&gt;));&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;}&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;font color="#000000" size="2" face="Consolas"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;XPO has a &lt;a href="http://documentation.devexpress.com/#XPO/clsDevExpressXpoMetadataReflectionDictionarytopic" target="_blank"&gt;dictionary&lt;/a&gt; of domain metadata. The metadata of each persistent object is stored in &lt;a href="http://documentation.devexpress.com/#XPO/clsDevExpressXpoMetadataXPClassInfotopic" target="_blank"&gt;XPClassInfo&lt;/a&gt; classes and the metadata of their properties is stored in &lt;a href="http://documentation.devexpress.com/#XPO/clsDevExpressXpoMetadataXPMemberInfotopic" target="_blank"&gt;XPMemberInfo&lt;/a&gt; classes. One of the main advantages of this approach is that it&amp;#160; adds a new member to the XPO dictionary and therefore follows XAF to the letter. This is because in order to form the model XAF first queries the XPO dictionary and finally in order to configure the views it queries the model. Since we have worked in the data layer our calculated values will be sent to any data bound enabled control for rendering. The other benefit is that if we code there are no restrictions on what we can do, for example we can create members calling a WCF service. The sky’s the limit!&lt;/p&gt;  &lt;p&gt;On the other hand each time we write new code we need to spend time testing and distributing it. Furthermore in certain scenarios problems can occur due to the fact that we add a new member to the object. For each new member we add to an object we are forced to deal with long properties lists in our model which can be somewhat unwieldy – imagine an&amp;#160; object with 200 properties.&lt;/p&gt;  &lt;p&gt;Note; XAF is smart enough to manage all of this without even breaking a sweat. This means that its performance does not suffer in any way. It is simply that this approach can leave the user with a bit of a headache! &lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&lt;strong&gt;2. &lt;u&gt;Using the model&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&lt;strong&gt;&lt;u&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;We have extended our model in order to describe all types of calculated and runtime properties. &lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_thumb14_05CA7076.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb[14]" border="0" alt="image_thumb[14]" src="http://community.devexpress.com/blogs/eaf/image_thumb14_thumb_03AD71AD.png" width="606" height="229" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;Having done this makes it pretty easy to utilize the powerful XPO and add members in its dictionary as with the previous approach. This means this method shares some of the benefits we mentioned above. However as we are not writing code we can’t enjoy the same level of flexibility unless we utilize &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3315" target="_blank"&gt;ModelUpdaters&lt;/a&gt;. Also as the columns can only be created using model editor they are only useful in situations when we have permission to modify the model. Finally we could end up with a huge number of properties here too for the same reason we identified previously.&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin:0px;" align="justify"&gt;All this is not to say that this approach doesn’t have its own unique advantages. For example the model difference can be stored in a database or xml file making it easy to distribute. To this end we can use the build in API or a specialized module like &lt;a href="http://www.expandframework.com/#IO" target="_blank"&gt;IO&lt;/a&gt;. Moreover it is possible to develop on site (client). Of course working at the model level allows us to use a model manager module like &lt;a href="http://www.expandframework.com/#modeldifference" target="_blank"&gt;ModelDifference&lt;/a&gt; which is a great aid. It can be used to distribute the unbound columns to users, roles and even to other applications. In addition since ModelDifference supports both platforms it is possible to create calculated members without restarting the application or IIS.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;3.&lt;/strong&gt;&lt;u&gt;&lt;strong&gt;WorldCreator extended members&lt;/strong&gt; &lt;/u&gt;&lt;/p&gt;  &lt;p align="justify"&gt;This module maps the structure of the &lt;a href="http://documentation.devexpress.com/#XPO/clsDevExpressXpoMetadataXPMemberInfotopic" target="_blank"&gt;XPMemberInfo&lt;/a&gt; class to a persistent object. This approach is again similar to model approach (and once again has similar benefits) however there is a crucial difference. Instead of using the model to gather data to form the calculated members we use the input taken from the UI. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_thumb17_01FCA5D9.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb[17]" border="0" alt="image_thumb[17]" src="http://community.devexpress.com/blogs/eaf/image_thumb17_thumb_24FCF17C.png" width="391" height="274" /&gt;&lt;/a&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_thumb20_212F26DF.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb[20]" border="0" alt="image_thumb[20]" src="http://community.devexpress.com/blogs/eaf/image_thumb20_thumb_7B59007B.png" width="397" height="363" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Using the UI is simplicity itself! It requires no technical knowledge whatsoever as the user is only required to choose from a set of basic options. We can still code if we wish, this time by creating persistent objects and then leaving eXpand to take care of the rest. That being said the real beauty of this approach is that the product can be developed on site without the user having to write a single line of code or using a sophisticated tool like &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument2830" target="_blank"&gt;Model Editor&lt;/a&gt;. Moreover we can enjoy ease of distribution due to the fact that our objects are stored in the database. As the metadata is now in the form of persistent objects locating it and working with it is as easy as ever. &lt;/p&gt;  &lt;p align="justify"&gt;By now it should be clear that as we are still relying on XPO we are faced with the same old problem regarding multiple views.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;u&gt;&lt;strong&gt;Using a WordCreator Dynamic Assembly&lt;/strong&gt; &lt;/u&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Our fourth approach uses the same module to create dynamic persistent assemblies using code generation templates. &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt; is the best framework to describe domains which is evidenced by the way that&amp;#160; WorldCreator maps the Assembly structure to persistent objects and auto generates a flexible UI.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_thumb23_2B9FD532.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image_thumb[23]" border="0" alt="image_thumb[23]" src="http://community.devexpress.com/blogs/eaf/image_thumb23_thumb_657EF251.png" width="422" height="538" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Using the templates will create a dynamic assembly with exactly the same code and structure as if we had taken the time to design it ourselves inside VS. Distribution is still easy since is everything is in the database. The fact that we script at runtime means that our options are almost unlimited when taking this approach.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;5. &lt;u&gt;The Unbound Column&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Extending the model with an Unbound column node as shown makes it possible to create Unbound grid columns and set their unbound expressions.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_72FD96AD.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_5F040417.png" width="526" height="101" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_0FB70BC3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_5C0E9F64.png" width="558" height="165" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;This is the only approach that allows us to work directly on views without utilizing XPO. This means that we gain the maximum level of flexibility since it is possible to have different columns for the same object views. Therefore we can work on this column independently. At the same time the end user can change the UnboundExpression at runtime using &lt;a href="http://documentation.devexpress.com/#WindowsForms/CustomDocument6212" target="_blank"&gt;expression editor&lt;/a&gt; (windows only). When it comes to distribution we find the same advantages as we do whenever we deal with the model.&lt;/p&gt;  &lt;p align="justify"&gt;As with the second approach we lose some flexibility because we are not writing code but again we can get round this using &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3315" target="_blank"&gt;ModelUpdaters&lt;/a&gt;. In addition our columns still cannot be used when we do not have permission to modify the model. Another disadvantage concerns the fact that XAF is designed to make all calculations in the data layer and send the values to controls by applying an MVC pattern. A few years after XAF was released, Microsoft built Silverlight featuring very similar architecture. Taking into account the various factors this has been recognized as the optimal approach. Although using Unbound columns allows us to work in a different way we need to write extra code to support each control (Tree, Pivot etc) because the calculations are performed in the UI.&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;br /&gt;We are happy to read your feedback about this!. Remember that your questions are the best candidates for future posts.&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=354333" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="eXpandFrameWork" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/eXpandFrameWork/default.aspx" /><category term="dynamic" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/dynamic/default.aspx" /><category term="Runtime" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/Runtime/default.aspx" /><category term="Calculated" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/Calculated/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>eXpandFrameWork Supporting Unbound Columns</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/09/16/expandframework-supporting-unbound-columns.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/09/16/expandframework-supporting-unbound-columns.aspx</id><published>2011-09-16T11:22:00Z</published><updated>2011-09-16T11:22:00Z</updated><content type="html">&lt;p&gt;&lt;em&gt;&lt;font size="1" face="Arial"&gt;Let me describe for a moment how we at DevExpress work. We build and sell software which means that we only sell and provide support for products that have been built and tested by us! However I am here as a framework evangelist and huge XAF fan. This makes it my duty to spread the word as much as I can and make XAF even bigger. To this end through collaboration within the XAF &lt;a href="http://community.devexpress.com/forums/162.aspx" target="_blank"&gt;community&lt;/a&gt;, we have been building and supporting &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt;. This framework follows XAF to the letter and takes things even further. &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; gets its inspiration from real life situations and bases itself on examples from DevExpress Support Center. &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpand&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; is the first open source project based on the DevExpress &lt;/font&gt;&lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;eXpressApp Framework (XAF)&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt;. More info is available at &lt;/font&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;font size="1" face="Arial"&gt;www.expandframework.com&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Arial"&gt; and our very existence relies on your efforts! Anyone is welcome to contribute and enjoy the rewards. It is not necessary to be a XAF guru, we can all manage to create a behavior taken from DevExpress &lt;a href="http://search.devexpress.com/?q=XPO+OR+XAF&amp;amp;p=T4|P2|0&amp;amp;d=16" target="_blank"&gt;code central&lt;/a&gt;. Let’s work together to enhance our beloved XAF!&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Recently in Xpand forums &lt;a href="http://www.expandframework.com/forum/profile/userid-338.html" target="_blank"&gt;Dionisis Soldatos&lt;/a&gt; raised a question about how unbound columns can be implemented with &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt;. Unbound columns along with their &lt;a href="http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridColumnsGridColumn_UnboundExpressiontopic" target="_blank"&gt;UnboundExpression&lt;/a&gt; can be used for creating calculated fields even at runtime. Since we are talking about unbound grid columns it should be obvious that we will operate at the UI level by modifying the grid control columns. However lets do a deep dive inside XAF model to extend it as needed!&lt;/p&gt;  &lt;p align="justify"&gt;&lt;u&gt;The Model&lt;/u&gt;&lt;/p&gt;  &lt;p align="justify"&gt;By now we are all used to XAF providing us with excellent out of the box solutions which negate the need for us to write hundredths of lines of code. This of course means money saved during developing and ultimately your product hits the market faster. Why spend time reinventing the wheel when the XAF team have already done the hard work for you?&lt;/p&gt;  &lt;p align="justify"&gt;XAF creates the model by reading the metadata of our classes, this model has 3 types of view. One of these is the ListView which can be displayed with data source enabled controls like Grid controls. ListView has columns which correspond to existing object properties metadata and when XAF creates a Grid at runtime it queries model’s ListView columns. It then creates and configures Grid columns from their attributes. These stages are well tested and it is preferable to use them in our solution and override the unnecessary stages. For example we could create a normal model column node using XAF default Add/Column menu. After the Grid column is created it we simply need a few lines of code to make it unbound and set its &lt;a href="http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridColumnsGridColumn_UnboundExpressiontopic" target="_blank"&gt;Unbound Expression&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_52133055.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_05DB26A7.png" width="429" height="92" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;In order to store this expression we still need to extend model’s ListView with an attribute. The model can be extended either by registering an interface at &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument2785" target="_blank"&gt;ModuleBase.ExtendModelInterfaces&lt;/a&gt; or by deriving it from an already registered interface. I am going to take the latter options by deriving from &lt;a href="http://documentation.devexpress.com/#Xaf/clsDevExpressExpressAppModelIModelColumntopic" target="_blank"&gt;IModelColumn&lt;/a&gt; interface which I will explain as we go. &lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;interface&lt;/span&gt; &lt;span style="color:#00008b;"&gt;IModelColumnUnbound&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;IModelColumn&lt;/span&gt; {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;Category&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;eXpand&amp;quot;&lt;/span&gt;)]&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;ShowUnboundExpressionMenu&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt;; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt;; }&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;Category&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;eXpand&amp;quot;&lt;/span&gt;)]&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#00008b;"&gt;Required&lt;/span&gt;]&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;UnboundExpression&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt;; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt;; }&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;}&lt;/p&gt;  &lt;p align="justify"&gt;XAF &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument2830" target="_blank"&gt;model editor&lt;/a&gt; is a highly sophisticated tool which has the capability to recognize that we extended the model. It then takes care of the vital step of adding an entry to the Add menu for creating Unbound columns.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_44CCA742.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_43880E63.png" width="526" height="101" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Now it is possible to create a new type of column with 2 extra attributes as shown,&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_42437584.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_04D310FD.png" width="558" height="165" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Moving on we need to set the mandatory PropertyName attribute shown above to an always existing object property name. Remember XAF requires this in order to behave as designed. To this end we are going to set as PropertyName the object’s key property name using this simple &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3169/5" target="_blank"&gt;DomainLogic&lt;/a&gt; class,&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;[&lt;span style="color:#00008b;"&gt;DomainLogic&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;IModelColumnUnbound&lt;/span&gt;))]&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;IModelColumnUnboundLogic&lt;/span&gt; {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;Get_PropertyName&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;IModelColumnUnbound&lt;/span&gt; columnUnbound) {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; ((&lt;span style="color:#00008b;"&gt;IModelListView&lt;/span&gt;)columnUnbound.&lt;span style="color:purple;"&gt;Parent&lt;/span&gt;.&lt;span style="color:purple;"&gt;Parent&lt;/span&gt;).&lt;span style="color:purple;"&gt;ModelClass&lt;/span&gt;.&lt;span style="color:purple;"&gt;KeyProperty&lt;/span&gt;;&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p align="justify"&gt;As a result (PropertyName, PropertyEditorType and Caption) attributes will be populated the next time we create a ColumnUnbound Node. However these will be fixed values and it is preferable to hide them from the end user. At the same time we need to mark Caption attribute as required and remove its default value. To do all of this we just need to extend our IModelColumnUnbound interface like this,&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_0A4181A1.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_0890B5CD.png" width="646" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Note; Although PropertyName and Caption belong to &lt;a href="http://documentation.devexpress.com/#Xaf/clsDevExpressExpressAppModelIModelColumntopic" target="_blank"&gt;IModelColumn&lt;/a&gt; using the new operator it is possible to override them!&lt;/p&gt;  &lt;p align="justify"&gt;We have now finished with the model modifications and for our ColumnUnbound nodes XAF by design will create a new column pointing back to object’s key property metadata.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;u&gt;The UI&lt;/u&gt;&lt;/p&gt;  &lt;p align="justify"&gt;A key benefit of XAF’s commitment to design patterns, specifically to the &lt;a href="http://tv.devexpress.com/#SingleResponsibilityPrinciple" target="_blank"&gt;Single responsibility principle&lt;/a&gt;, is that it provides us with the model’s synchronizer classes. These can be used to synchronize our model with the control and vice versa. It is only necessary to derive from the abstract ModelSyncroniser&amp;lt;T,V&amp;gt; and implement ApplyModeCore method to synchronize the control and from SynchronizeModel to do the same with the model.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;c&lt;/span&gt;: &lt;span style="color:#00008b;"&gt;ModelSynchronizer&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;GridListEditor&lt;/span&gt;, &lt;span style="color:#00008b;"&gt;IModelListView&lt;/span&gt;&amp;gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;UnboundColumnSynchronizer&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;GridListEditor&lt;/span&gt; control, &lt;span style="color:#00008b;"&gt;IModelListView&lt;/span&gt; model)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color:#00008b;"&gt;base&lt;/span&gt;(control, model) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;ApplyModelCore&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; xafGridColumns = &lt;span style="color:#008b8b;"&gt;GetXafGridColumns&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;column&lt;/span&gt; &lt;span style="color:blue;"&gt;in&lt;/span&gt; xafGridColumns) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; modelColumnUnbound = (&lt;span style="color:#00008b;"&gt;IModelColumnUnbound&lt;/span&gt;)&lt;span style="font-weight:bold;"&gt;column&lt;/span&gt;.&lt;span style="color:purple;"&gt;Model&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;"&gt;column&lt;/span&gt;.&lt;span style="color:purple;"&gt;FieldName&lt;/span&gt; = modelColumnUnbound.&lt;span style="color:purple;"&gt;Id&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;"&gt;column&lt;/span&gt;.&lt;span style="color:purple;"&gt;UnboundType&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;UnboundColumnType&lt;/span&gt;.&lt;span style="color:purple;font-weight:bold;"&gt;Object&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;"&gt;column&lt;/span&gt;.&lt;span style="color:purple;"&gt;OptionsColumn&lt;/span&gt;.&lt;span style="color:purple;"&gt;AllowEdit&lt;/span&gt; = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;"&gt;column&lt;/span&gt;.&lt;span style="color:purple;"&gt;ShowUnboundExpressionMenu&lt;/span&gt; = modelColumnUnbound.&lt;span style="color:purple;"&gt;ShowUnboundExpressionMenu&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="font-weight:bold;"&gt;column&lt;/span&gt;.&lt;span style="color:purple;"&gt;UnboundExpression&lt;/span&gt; = modelColumnUnbound.&lt;span style="color:purple;"&gt;UnboundExpression&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#00008b;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;XafGridColumn&lt;/span&gt;&amp;gt; &lt;span style="color:#008b8b;"&gt;GetXafGridColumns&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#00008b;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;XafGridColumn&lt;/span&gt;&amp;gt; xafGridColumns =&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:purple;"&gt;Model&lt;/span&gt;.&lt;span style="color:purple;"&gt;Columns&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;OfType&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;IModelColumnUnbound&lt;/span&gt;&amp;gt;().&lt;span style="color:#008b8b;"&gt;Select&lt;/span&gt;(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; unbound =&amp;gt; &lt;span style="color:purple;"&gt;Control&lt;/span&gt;.&lt;span style="color:purple;"&gt;GridView&lt;/span&gt;.&lt;span style="color:purple;"&gt;Columns&lt;/span&gt;[unbound.&lt;span style="color:purple;"&gt;PropertyName&lt;/span&gt;] &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#00008b;"&gt;XafGridColumn&lt;/span&gt;).&lt;span style="color:#008b8b;"&gt;Where&lt;/span&gt;(column =&amp;gt; column != &lt;span style="color:blue;"&gt;null&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; xafGridColumns;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;SynchronizeModel&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; xafGridColumns = &lt;span style="color:#008b8b;"&gt;GetXafGridColumns&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;xafGridColumn&lt;/span&gt; &lt;span style="color:blue;"&gt;in&lt;/span&gt; xafGridColumns) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ((&lt;span style="color:#00008b;"&gt;IModelColumnUnbound&lt;/span&gt;) &lt;span style="font-weight:bold;"&gt;xafGridColumn&lt;/span&gt;.&lt;span style="color:purple;"&gt;Model&lt;/span&gt;).&lt;span style="color:purple;"&gt;UnboundExpression&lt;/span&gt; = &lt;span style="font-weight:bold;"&gt;xafGridColumn&lt;/span&gt;.&lt;span style="color:purple;"&gt;UnboundExpression&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;/div&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;The above code uses the GetXafGridColumns method to return the grid columns that correspond to IModelColumnUnbound nodes. The web implementation is very similar and can be found &lt;a href="https://github.com/expand/eXpand/blob/master/Xpand/Xpand.ExpressApp/Xpand.ExpressApp.Web/SystemModule/UnboundColumnController.cs" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;All that is left is to register our UnboundColumnSynchronizer like this,&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;UnboundColumnController&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;ViewController&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ListView&lt;/span&gt;&amp;gt; {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;OnActivated&lt;/span&gt;() {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;base&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;OnActivated&lt;/span&gt;();&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; gridListEditor = &lt;span style="color:purple;"&gt;View&lt;/span&gt;.&lt;span style="color:purple;"&gt;Editor&lt;/span&gt; &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#00008b;"&gt;GridListEditor&lt;/span&gt;;&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (gridListEditor != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; gridListEditor.&lt;span style="color:fuchsia;"&gt;CreateCustomModelSynchronizer&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;+=&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GridListEditorOnCreateCustomModelSynchronizer&lt;/span&gt;;&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GridListEditorOnCreateCustomModelSynchronizer&lt;/span&gt;(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#00008b;"&gt;CreateCustomModelSynchronizerEventArgs&lt;/span&gt; createCustomModelSynchronizerEventArgs) {&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; createCustomModelSynchronizerEventArgs.&lt;span style="color:purple;"&gt;ModelSynchronizer&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;UnboundColumnSynchronizer&lt;/span&gt;((&lt;span style="color:#00008b;"&gt;GridListEditor&lt;/span&gt;)sender, &lt;span style="color:purple;"&gt;View&lt;/span&gt;.&lt;span style="color:purple;"&gt;Model&lt;/span&gt;);&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;}&lt;/p&gt;  &lt;p style="margin:0px;font-family:consolas;background:white;color:black;font-size:10pt;" align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Note; Setting ShowUnboundExpressionMenu to true is only supported by Windows platform. There, an end user can modify the UnBoundExpression by invoking Grid’s &lt;a href="http://documentation.devexpress.com/#WindowsForms/CustomDocument6212" target="_blank"&gt;expression editor&lt;/a&gt;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_22AA5132.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_32D6192B.png" width="292" height="384" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/image_064CE945.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://community.devexpress.com/blogs/eaf/image_thumb_3693BDFB.png" width="578" height="421" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p align="justify"&gt;Together with the unbound column Xpand allows for up to 5 different approaches to creating calculated fields. In the next post we will discuss the pros and cons of each approach so stay tuned!&lt;/p&gt;  &lt;p&gt;We are happy to read your feedback about this!. Remember that your questions are the best candidates for future posts &lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=354448" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="eXpandFrameWork" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/eXpandFrameWork/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>Checking whether the currently logged user belongs to a certain role in a filter becomes easier in 11.1.7</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/09/12/checking-whether-the-currently-logged-user-belongs-to-a-certain-role-in-a-filter-becomes-easier.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/09/12/checking-whether-the-currently-logged-user-belongs-to-a-certain-role-in-a-filter-becomes-easier.aspx</id><published>2011-09-12T08:55:00Z</published><updated>2011-09-12T08:55:00Z</updated><content type="html">&lt;h3 align="justify"&gt;Prerequisites&lt;/h3&gt;  &lt;p align="justify"&gt;I am confident that every user who utilized XAF’s &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument2650"&gt;Security module&lt;/a&gt; with the &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument2768"&gt;Complex Security strategy&lt;/a&gt; should have met this requirement at least once using XAF, for example, when you had to filter out a ListView to display records only for people from the Administrators role and hide them from the rest. Or, you wanted to make your favorite &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3286"&gt;Appearance&lt;/a&gt; or &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3009"&gt;Validation&lt;/a&gt; rule work only for people from the Users role? Sound familiar?&lt;/p&gt;  &lt;p align="justify"&gt;A good way to address such requirements is to implement a custom &lt;a href="http://documentation.devexpress.com/#CoreLibraries/CustomDocument9947"&gt;function criteria operator&lt;/a&gt;. &lt;a href="http://community.devexpress.com/blogs/tolis/default.aspx"&gt;Tolis&lt;/a&gt; recently demonstrated how it can be done in his &lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/07/22/applying-security-to-state-machine-module.aspx"&gt;recent blog post&lt;/a&gt; about applying security to the &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3336"&gt;State Machine module&lt;/a&gt;. The first time I saw the blog, I thought that it would be nice to have such a function in XAF out-of-the-box. So, shortly thereafter, after seeing &lt;a href="http://community.devexpress.com/forums/t/103592.aspx"&gt;a discussion on the forum&lt;/a&gt;, I logged a corresponding &lt;a href="http://www.devexpress.com/Support/Center/p/S37896.aspx"&gt;feature request&lt;/a&gt;. &lt;/p&gt;  &lt;h3 align="justify"&gt;New built-in criteria function&lt;/h3&gt;  &lt;p align="justify"&gt;This feature request was implemented in version &lt;strong&gt;11.1.7&lt;/strong&gt;, and that means that you can already make use of the new &lt;strong&gt;IsCurrentUserInRole&lt;/strong&gt; function in your criteria. The function’s use is very simple. All that you need to do is to pass the name of the role as a parameter: &lt;/p&gt;  &lt;p align="justify"&gt;&lt;font face="Courier New"&gt;IsCurrentUserInRole(‘Administrators’)&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;I expect that this built-in criteria function will be no less popular than the &lt;em&gt;&lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3307"&gt;CurrentUserId&lt;/a&gt;()&lt;/em&gt;&amp;#160; function and will also save you a lot of time, because the described requirements are quite common in business applications.&lt;/p&gt;  &lt;h3 align="justify"&gt;Future plans&lt;/h3&gt;  &lt;p align="justify"&gt;While we are talking about custom criteria functions, a note about our future plans. Although XAF already provides a similar feature called &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3307"&gt;Read-Only Parameters&lt;/a&gt;, we are gradually stepping away from it and moving towards custom criteria functions everywhere. This is because they provide more capabilities (e.g. they are &lt;a href="http://community.devexpress.com/blogs/garyshort/archive/2011/03/16/xpo-11-1-sneak-peek-custom-functions-part-1.aspx"&gt;supported by all DevExpress products&lt;/a&gt; and not only in XAF; functions can accept arguments whereas Read Only Parameters are constants, etc.). It is intended not only to optimize our support costs, but also to allow a faster evolution of our products.&lt;/p&gt;  &lt;p align="justify"&gt;Do you like this small improvement? Please let us know your opinion! Happy XAFing!&lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://community.devexpress.com/blogs/eaf/wlEmoticon-winkingsmile_3A8CDAB1.png" /&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=353841" width="1" height="1"&gt;</content><author><name>Dennis (DevExpress Support)</name><uri>http://community.devexpress.com/members/Dennis-_2800_DevExpress-Support_2900_.aspx</uri></author><category term="Filtering" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/Filtering/default.aspx" /><category term="criteria" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/criteria/default.aspx" /><category term="IsCurrentUserInRole" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/IsCurrentUserInRole/default.aspx" /><category term="security" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/security/default.aspx" /><category term="11.1.7" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/11.1.7/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>Scheduling workflows in eXpandFrameWork</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/09/05/scheduling-workflows-in-expandframework.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/09/05/scheduling-workflows-in-expandframework.aspx</id><published>2011-09-05T00:30:00Z</published><updated>2011-09-05T00:30:00Z</updated><content type="html">&lt;p&gt;&lt;em&gt;&lt;span style="font:10px Arial;"&gt;Let me describe for a moment how we at DevExpress work. We build and sell software which means that we only sell and provide support for products that have been built and tested by us! However I am here as a framework evangelist and huge XAF fan. This makes it my duty to spread the word as much as I can and make XAF even bigger. To this end through collaboration within the XAF &lt;a href="http://community.devexpress.com/forums/162.aspx" target="_blank"&gt;community&lt;/a&gt;, we have been building and supporting &lt;/span&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;span style="font:10px Arial;"&gt;eXpand&lt;/span&gt;&lt;/a&gt;&lt;span style="font:10px Arial;"&gt;. This framework follows XAF to the letter and takes things even further. &lt;/span&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;span style="font:10px Arial;"&gt;eXpand&lt;/span&gt;&lt;/a&gt;&lt;span style="font:10px Arial;"&gt; gets its inspiration from real life situations and bases itself on examples from DevExpress Support Center. &lt;/span&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;span style="font:10px Arial;"&gt;eXpand&lt;/span&gt;&lt;/a&gt;&lt;span style="font:10px Arial;"&gt; is the first open source project based on the DevExpress &lt;/span&gt;&lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;&lt;span style="font:10px Arial;"&gt;eXpressApp Framework (XAF)&lt;/span&gt;&lt;/a&gt;&lt;span style="font:10px Arial;"&gt;. More info is available at &lt;/span&gt;&lt;a href="http://www.expandframework.com/" target="_blank"&gt;&lt;span style="font:10px Arial;"&gt;www.expandframework.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font:10px Arial;"&gt; and our very existence relies on your efforts! Anyone is welcome to contribute and enjoy the rewards. It is not necessary to be a XAF guru, we can all manage to create a behavior taken from DevExpress &lt;a href="http://search.devexpress.com/?q=XPO+OR+XAF&amp;amp;p=T4|P2|0&amp;amp;d=16" target="_blank"&gt;code central&lt;/a&gt;. Let’s work together to enhance our beloved XAF!&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;In this post we are going to extend the functionality of the &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3343" target="_blank"&gt;workflow module&lt;/a&gt;. to create a UI that will help us to schedule workflows. Some of you may recall that we looked at using a Delay inside a While activity in &lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/06/14/working-with-crud-activities-short-transactions.aspx" target="_blank"&gt;Working with CRUD activities – Short Transactions.&lt;/a&gt; Recently, DX-Squad member &lt;a href="http://community.devexpress.com/members/Martin-Praxmarer-_5B00_DX_2D00_Squad_5D00_.aspx" target="_blank"&gt;Martin Praxmarer&lt;/a&gt; raised an interesting question relating to this topic: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;I have the requirement to do a workflow which starts each day on 6 clock - searches for orderdocuments where a specific date is less then X days. I know I will do an do while loop, but workflow definition has 2 options, start when new object, start when criteria, so when do i start this Workflow?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;In order to achieve this we will use the WorkFlow demo that ships with our framework. The first thing is to design our custom ScheduledWorkflow persistent object by implementing IWorkflowDefinition. We didn’t derive it from the existing WorkFlowDefinition object because it has properties like TargetObjectType and start up conditions. &lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;enum&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StartMode&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;color:purple;"&gt;OneTime&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;color:purple;"&gt;Daily&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-weight:bold;color:purple;"&gt;Weekly&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;[&lt;span style="color:#00008b;"&gt;DefaultClassOptions&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;[&lt;span style="color:#00008b;"&gt;Appearance&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;WeekDays&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;StartMode &amp;lt;&amp;gt; &amp;#39;Weekly&amp;#39;&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:purple;"&gt;TargetItems&lt;/span&gt; = &lt;span style="color:#a31515;"&gt;&amp;quot;RecurEveryWeeks;Moday;Tuesday;Wednesday;Thursday;Friday;Saturday;Sunday&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:purple;"&gt;Visibility&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;ViewItemVisibility&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;Hide&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;BaseObject&lt;/span&gt;, &lt;span style="color:#00008b;"&gt;IWorkflowDefinition&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;Session&lt;/span&gt; session)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color:#00008b;"&gt;base&lt;/span&gt;(session) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;IsActive&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;IsActive&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;IsActive&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;RuntASAPIfScheduledStartIsMissed&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;RuntASAPIfScheduledStartIsMissed&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;RuntASAPIfScheduledStartIsMissed&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#00008b;"&gt;Association&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;XPCollection&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ScheduledWorkflowLaunchHistory&lt;/span&gt;&amp;gt; &lt;span style="color:purple;"&gt;LaunchHistoryItems&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetCollection&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ScheduledWorkflowLaunchHistory&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;LaunchHistoryItems&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#00008b;"&gt;ImmediatePostData&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;StartMode&lt;/span&gt; &lt;span style="color:purple;"&gt;StartMode&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;StartMode&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;StartMode&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;StartMode&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;TimeSpan&lt;/span&gt; &lt;span style="color:purple;"&gt;StartTime&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;TimeSpan&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;StartTime&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;StartTime&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#00008b;"&gt;Appearance&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;RecurEveryDays&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;StartMode &amp;lt;&amp;gt; &amp;#39;Daily&amp;#39;&amp;quot;&lt;/span&gt;, &lt;span style="color:purple;"&gt;Visibility&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;ViewItemVisibility&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;Hide&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; &lt;span style="color:purple;"&gt;RecurEveryDays&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;RecurEveryDays&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;RecurEveryDays&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; &lt;span style="color:purple;"&gt;RecurEveryWeeks&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;RecurEveryWeeks&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;RecurEveryWeeks&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;Monday&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Monday&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Monday&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;Tuesday&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Tuesday&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Tuesday&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;Wednesday&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Wednesday&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Wednesday&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;Thursday&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Thursday&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Thursday&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;Friday&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Friday&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Friday&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;Saturday&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Saturday&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Saturday&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;Sunday&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Sunday&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Sunday&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt; IWorkflowDefinition Members&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetActivityTypeName&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetUniqueId&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;IStartWorkflowCondition&lt;/span&gt;&amp;gt; &lt;span style="color:#008b8b;"&gt;GetConditions&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;IStartWorkflowCondition&lt;/span&gt;[0];&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetUniqueId&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:purple;"&gt;Session&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;IsNewObject&lt;/span&gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;)) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;InvalidOperationException&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;ScheduledWorkflow&amp;quot;&lt;/span&gt; + &lt;span style="color:purple;"&gt;Oid&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;ToString&lt;/span&gt;().&lt;span style="color:#008b8b;"&gt;ToUpper&lt;/span&gt;().&lt;span style="color:#008b8b;"&gt;Replace&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;_&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#00008b;"&gt;Browsable&lt;/span&gt;(&lt;span style="color:blue;"&gt;false&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;CanCompile&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;false&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#00008b;"&gt;Browsable&lt;/span&gt;(&lt;span style="color:blue;"&gt;false&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:purple;"&gt;CanOpenHost&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:purple;"&gt;IsActive&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span style="color:blue;"&gt;string&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;IsNullOrEmpty&lt;/span&gt;(&lt;span style="color:purple;"&gt;Name&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;Name&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#00008b;"&gt;Size&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;SizeAttribute&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;Unlimited&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; &lt;span style="color:purple;"&gt;Xaml&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Xaml&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Xaml&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;AfterConstruction&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;base&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;AfterConstruction&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:purple;"&gt;Xaml&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;DCWorkflowDefinitionLogic&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;InitialXaml&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;In the above class we have added some scheduled specific properties such as &lt;span style="color:purple;"&gt;StartMode, &lt;span style="color:purple;"&gt;StartTime, &lt;span style="color:purple;"&gt;RecurEveryDays &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;etc. The class has been decorated with the &lt;span style="color:#00008b;"&gt;Appearance &lt;/span&gt;attribute to control the visibility of the Day properties. This means when StartMode &amp;lt;&amp;gt; &amp;#39;Weekly these properties will be hidden. &lt;/p&gt;  &lt;p&gt;Moreover there is a collection &lt;span style="color:purple;"&gt;LaunchHistoryItems &lt;/span&gt;of &lt;span style="color:#00008b;"&gt;ScheduledWorkflowLaunchHistory &lt;/span&gt;objects, which will be used later to check if the workflow has been launched.&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowLaunchHistory&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;BaseObject&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowLaunchHistory&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;Session&lt;/span&gt; session) : &lt;span style="color:#00008b;"&gt;base&lt;/span&gt;(session) {}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;DateTime&lt;/span&gt; &lt;span style="color:purple;"&gt;LaunchedOn&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;DateTime&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;LaunchedOn&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;DateTime&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;LaunchedOn&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#00008b;"&gt;Association&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt; &lt;span style="color:purple;"&gt;Workflow&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;GetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Workflow&amp;quot;&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008b8b;"&gt;set&lt;/span&gt; { &lt;span style="color:#008b8b;"&gt;SetPropertyValue&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Workflow&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;value&lt;/span&gt;); }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;After designing these classes, we now have all the required input in order to schedule our workflows.&lt;/p&gt;  &lt;p&gt;The next step is to load our custom workflows by extending the workflow provider service as shown,&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowDefinitionProvider&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;WorkflowDefinitionProvider&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowDefinitionProvider&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;Type&lt;/span&gt; workflowDefinitionType) : &lt;span style="color:#00008b;"&gt;base&lt;/span&gt;(workflowDefinitionType) { }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowDefinitionProvider&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;Type&lt;/span&gt; workflowDefinitionType, &lt;span style="color:#00008b;"&gt;IObjectSpaceProvider&lt;/span&gt; objectSpaceProvider) : &lt;span style="color:#00008b;"&gt;base&lt;/span&gt;(workflowDefinitionType, objectSpaceProvider) { }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:#00008b;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;IWorkflowDefinition&lt;/span&gt;&amp;gt; &lt;span style="color:#008b8b;"&gt;GetDefinitions&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#00008b;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;IWorkflowDefinition&lt;/span&gt;&amp;gt; result = &lt;span style="color:blue;"&gt;base&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;GetDefinitions&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#00008b;"&gt;IObjectSpace&lt;/span&gt; objectSpace = &lt;span style="color:purple;"&gt;ObjectSpaceProvider&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;CreateObjectSpace&lt;/span&gt;(); &lt;span style="color:green;"&gt;//don&amp;#39;t dispose immediately&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;workflow&lt;/span&gt; &lt;span style="color:blue;"&gt;in&lt;/span&gt; objectSpace.&lt;span style="color:#008b8b;"&gt;GetObjects&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt;&amp;gt;()) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result.&lt;span style="color:#008b8b;"&gt;Add&lt;/span&gt;(&lt;span style="font-weight:bold;"&gt;workflow&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; result;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;After this we are ready to implement our final service that will schedule our workflows,&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowStartService&lt;/span&gt; : &lt;span style="color:#00008b;"&gt;BaseTimerService&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;NeedToStartWorkflow&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;IObjectSpace&lt;/span&gt; objectSpace, &lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt; workflow) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (workflow.&lt;span style="color:purple;"&gt;StartMode&lt;/span&gt; == &lt;span style="color:#00008b;"&gt;StartMode&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;OneTime&lt;/span&gt;) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (workflow.&lt;span style="color:purple;"&gt;LaunchHistoryItems&lt;/span&gt;.&lt;span style="color:purple;"&gt;Count&lt;/span&gt; == 0) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color:blue;"&gt;else&lt;/span&gt; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (workflow.&lt;span style="color:purple;"&gt;StartMode&lt;/span&gt; == &lt;span style="color:#00008b;"&gt;StartMode&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;Daily&lt;/span&gt;) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; historyItem = objectSpace.&lt;span style="color:#008b8b;"&gt;FindObject&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ScheduledWorkflowLaunchHistory&lt;/span&gt;&amp;gt;(&lt;span style="color:#00008b;"&gt;CriteriaOperator&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;Parse&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;GetDate(LaunchedOn) = ?&amp;quot;&lt;/span&gt;, &lt;span style="color:#00008b;"&gt;DateTime&lt;/span&gt;.&lt;span style="color:purple;"&gt;Today&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (historyItem == &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color:#00008b;"&gt;DateTime&lt;/span&gt;.&lt;span style="color:purple;"&gt;Now&lt;/span&gt;.&lt;span style="color:purple;"&gt;TimeOfDay&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;&amp;gt;&lt;/span&gt; workflow.&lt;span style="color:purple;"&gt;StartTime&lt;/span&gt;) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color:blue;"&gt;else&lt;/span&gt; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (workflow.&lt;span style="color:purple;"&gt;StartMode&lt;/span&gt; == &lt;span style="color:#00008b;"&gt;StartMode&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;Weekly&lt;/span&gt;) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;NotImplementedException&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowStartService&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color:#00008b;"&gt;base&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;TimeSpan&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;FromMinutes&lt;/span&gt;(1)) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowStartService&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;TimeSpan&lt;/span&gt; requestsDetectionPeriod) : &lt;span style="color:#00008b;"&gt;base&lt;/span&gt;(requestsDetectionPeriod) { }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;OnTimer&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;IObjectSpace&lt;/span&gt; objectSpace = &lt;span style="color:purple;"&gt;ObjectSpaceProvider&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;CreateObjectSpace&lt;/span&gt;()) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt; &lt;span style="font-weight:bold;"&gt;workflow&lt;/span&gt; &lt;span style="color:blue;"&gt;in&lt;/span&gt; objectSpace.&lt;span style="color:#008b8b;"&gt;GetObjects&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ScheduledWorkflow&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;BinaryOperator&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;IsActive&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;true&lt;/span&gt;))) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#00008b;"&gt;WorkflowHost&lt;/span&gt; host;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:purple;"&gt;HostManager&lt;/span&gt;.&lt;span style="color:purple;"&gt;Hosts&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;TryGetValue&lt;/span&gt;(&lt;span style="font-weight:bold;"&gt;workflow&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;GetUniqueId&lt;/span&gt;(), &lt;span style="color:blue;"&gt;out&lt;/span&gt; host)) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:#008b8b;"&gt;NeedToStartWorkflow&lt;/span&gt;(objectSpace, &lt;span style="font-weight:bold;"&gt;workflow&lt;/span&gt;)) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; host.&lt;span style="color:#008b8b;"&gt;StartWorkflow&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; historyItem = objectSpace.&lt;span style="color:#008b8b;"&gt;CreateObject&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;ScheduledWorkflowLaunchHistory&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; historyItem.&lt;span style="color:purple;"&gt;Workflow&lt;/span&gt; = &lt;span style="font-weight:bold;"&gt;workflow&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; historyItem.&lt;span style="color:purple;"&gt;LaunchedOn&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;DateTime&lt;/span&gt;.&lt;span style="color:purple;"&gt;Now&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objectSpace.&lt;span style="color:#008b8b;"&gt;CommitChanges&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;em&gt;Note; the service is not fully implemented, however its very easy to continue from this point. This code will live in the new Xpand.ExpressApp.Workflow module. Now, for&lt;/em&gt;&lt;em&gt; the rest of the implementation I would like to ask the help of our community. Anyone that wants to finish it contribute it is most welcome! &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Finally we modify the WorkflowServerStarter class and add this service,&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;Start_&lt;/span&gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt; connectionString, &lt;span style="color:blue;"&gt;string&lt;/span&gt; applicationName) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#00008b;"&gt;ServerApplication&lt;/span&gt; serverApplication = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ServerApplication&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverApplication.&lt;span style="color:purple;"&gt;ApplicationName&lt;/span&gt; = applicationName;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverApplication.&lt;span style="color:purple;"&gt;Modules&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;Add&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;WorkflowDemoModule&lt;/span&gt;());&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverApplication.&lt;span style="color:purple;"&gt;ConnectionString&lt;/span&gt; = connectionString;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverApplication.&lt;span style="color:purple;"&gt;Security&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;SecurityComplex&lt;/span&gt;&amp;lt;&lt;span style="color:#00008b;"&gt;User&lt;/span&gt;, &lt;span style="color:#00008b;"&gt;Role&lt;/span&gt;&amp;gt;(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;WorkflowServerAuthentication&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;BinaryOperator&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;UserName&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;WorkflowService&amp;quot;&lt;/span&gt;)));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverApplication.&lt;span style="color:#008b8b;"&gt;Setup&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverApplication.&lt;span style="color:#008b8b;"&gt;Logon&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#00008b;"&gt;IObjectSpaceProvider&lt;/span&gt; objectSpaceProvider = serverApplication.&lt;span style="color:purple;"&gt;ObjectSpaceProvider&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:purple;"&gt;server&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;WorkflowServer&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;http://localhost:46232&amp;quot;&lt;/span&gt;, objectSpaceProvider, objectSpaceProvider);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:purple;"&gt;server&lt;/span&gt;.&lt;span style="color:purple;"&gt;WorkflowDefinitionProvider&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowDefinitionProvider&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;XpoWorkflowDefinition&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green;"&gt;//Add the service&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:purple;"&gt;server&lt;/span&gt;.&lt;span style="color:purple;"&gt;ServiceProvider&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;AddService&lt;/span&gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;ScheduledWorkflowStartService&lt;/span&gt;());&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;We are now ready to go!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/4-9-2011-12-50-05-_03CD2545.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="4-9-2011 12-50-05 μμ" border="0" alt="4-9-2011 12-50-05 μμ" src="http://community.devexpress.com/blogs/eaf/4-9-2011-12-50-05-_thumb_0FEE9F6C.png" width="760" height="557" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note; You can watch this approach live in this &lt;a href="http://tv.devexpress.com/#AskXAFAugust;eXpressApp+Framework.product;1" target="_blank"&gt;webinar&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;strong&gt;Related Links&lt;/strong&gt; &lt;/span&gt;    &lt;br /&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/archive/tags/WF/default.aspx" target="_blank"&gt;Blog posts&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3343" target="_blank"&gt;Online documentation&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://tv.devexpress.com/#;WorkFlow.tag;1" target="_blank"&gt;Videos&lt;/a&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=353322" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="WF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/WF/default.aspx" /><category term="eXpandFrameWork" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/eXpandFrameWork/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>XAF- XPO Ask the Team Webinar–August</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/08/30/xaf-xpo-ask-the-team-webinar-august.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/08/30/xaf-xpo-ask-the-team-webinar-august.aspx</id><published>2011-08-30T04:08:00Z</published><updated>2011-08-30T04:08:00Z</updated><content type="html">&lt;p&gt;This is a reminder post for today’s webinar. We are going to cover 3 main areas. Firstly we are going to demo how to extend our Workflow module in order to provide support for scheduled workflows. Then we are going to see how nested properties are handled by our enhanced FilterEditor. Finally we are going to explore a very early preview of a Middle Tier &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt; application. In this preview only the security is implemented as a service, however the point of the demo is to show the general direction when working with an application server.&lt;/p&gt;  &lt;p&gt;The team and myself are really looking forward to speak to you this evening, so pop along and &lt;a href="http://www.devexpress.com/Support/Webinars/details.xml?id=AskXAFAugust" target="_blank"&gt;register&lt;/a&gt; now!&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=352904" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="webinar" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/webinar/default.aspx" /><category term="XPO" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XPO/default.aspx" /><category term="ask team" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/ask+team/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>XAF Workflow persistence storage</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/08/24/xaf-workflow-persistence-storage.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/08/24/xaf-workflow-persistence-storage.aspx</id><published>2011-08-24T07:27:00Z</published><updated>2011-08-24T07:27:00Z</updated><content type="html">&lt;p&gt;The .NET Framework 4 ships with the SQL Workflow Instance Store which allows workflows to persist state information about workflow instances in a SQL Server 2005 or SQL Server 2008 database. However its implementation is based on stored procedures which can be a bit scary if you are not familiar with them. In addition our customers may follow different standards (Oracle, Firebird, VistaDB, MySQL, PostgreSQL etc.) and it’s unrealistic to hire more people to support SQL Server infrastructure.&lt;/p&gt;  &lt;p&gt;Usually when dealing with these issues the first thing we do is to carry out a Google search for storage solutions. Surprisingly there is no such solution out there! Moreover there is very little useful code or samples available. Luckily XAF provides us with an easier route!&lt;/p&gt;  &lt;p&gt;XAF is the perfect workflow modeling environment. It provides a ready made solution for creating and deploying a server that will execute workflows as described &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3343" target="_blank"&gt;here&lt;/a&gt;.&amp;nbsp; In order to start modeling workflows we can use VS design time along with our re-hosted runtime &lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/05/24/xaf-workflow-visual-designer.aspx" target="_blank"&gt;Workflow designer and custom WF4 activities&lt;/a&gt;. XAF also gives us increased control over our workflows for example through the ability to &lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/07/19/manually-starting-workflows.aspx" target="_blank"&gt;manually start workflows&lt;/a&gt;. Finally since &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt; uses &lt;a href="http://www.devexpress.com/Products/NET/ORM/" target="_blank"&gt;XPO&lt;/a&gt; to access data we can easily support 16 different database systems simply by providing a connection string!&lt;/p&gt;  &lt;div class="tablediv"&gt;   &lt;table class="dtTABLE    " cellspacing="0"&gt;       &lt;tr&gt;         &lt;th&gt;XPO Data Store Adapter&lt;/th&gt;          &lt;th&gt;XPO Data Store Adapter&amp;#39;s Assembly Name&lt;/th&gt;          &lt;th&gt;Database Provider Assembly&lt;/th&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;&lt;a href="http://community.devexpress.com/XPO/clsDevExpressXpoDBAccessConnectionProvidertopic.aspx"&gt;AccessConnectionProvider&lt;/a&gt;&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX&lt;/td&gt;          &lt;td&gt;System.Data.dll&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;AdvantageConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;Advantage.Data.Provider.dll 9.10.2.0&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;AsaConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;iAnywhere.Data.SQLAnywhere.dll 11.0.0.12642&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;AseConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;Sybase.Data.AseClient.dll 1.15.50.0&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;DB2ConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;IBM.Data.DB2.dll 9.5.2.2&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;FirebirdConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;FirebirdSql.Data.Firebird.dll 1.7.1.0            &lt;br /&gt;FirebirdSql.Data.FirebirdClient.dll 2.5.1.0 &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;&lt;a href="http://community.devexpress.com/XPO/clsDevExpressXpoDBMSSqlConnectionProvidertopic.aspx"&gt;MSSqlConnectionProvider&lt;/a&gt;&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX&lt;/td&gt;          &lt;td&gt;System.Data.dll&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;MSSqlCEConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;System.Data.SqlServerCe.dll 3.5.0            &lt;br /&gt;System.Data.SqlServerCe.dll 4.0.8482.1 &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;MySqlConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;MySql.Data.dll 5.2.5.0&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;OracleConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;System.Data.OracleClient.dll 2.0.0.0            &lt;br /&gt;Oracle.DataAccess.dll 9.2.0.700 &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;ODPConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;Oracle.DataAccess.dll 10.1.0.200&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;PervasiveSqlConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;Pervasive.Data.SqlClient.dll 2.10.0.15&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;PostgreSqlConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;Npgsql.dll 2.0.11.0&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;SQLiteConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;System.Data.SQLite.dll 1.0.61.0&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td&gt;VistaDBConnectionProvider&lt;/td&gt;          &lt;td&gt;DevExpress.Xpo.vXXX.Providers&lt;/td&gt;          &lt;td&gt;VistaDB.4.dll 4.0.0.0&lt;/td&gt;       &lt;/tr&gt;     &lt;/table&gt; &lt;/div&gt;  &lt;p&gt;More info @ &lt;a href="http://documentation.devexpress.com/#XPO/CustomDocument2114" target="_blank"&gt;Database Systems Supported by XPO&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is only one example of what XAF can do for us. XAF provides a comprehensive set of solutions that allow you to outsource all of the mundane programming tasks leaving you to focus purely on your business needs. For more info consult our &lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument2670"&gt;docs&lt;/a&gt;, &lt;a href="http://community.devexpress.com/blogs/eaf/" target="_blank"&gt;blogs&lt;/a&gt;, &lt;a href="http://search.devexpress.com/?q=XAF+OR+XPO&amp;amp;p=T4|P2|54&amp;amp;d=16" target="_blank"&gt;code central&lt;/a&gt; and &lt;a href="http://www.devexpress.com/Support/Center/" target="_blank"&gt;support center&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;DevExpress Workflow Instance Store&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;;font-size:12pt;" class="Apple-style-span"&gt;&lt;/span&gt;  &lt;p&gt;In version 11.1.7 our team now provides workflow instance support outside &lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/" target="_blank"&gt;XAF&lt;/a&gt; borders! With a few lines of code, it is now possible to store our workflows in any of the 14 database systems described.&lt;/p&gt;  &lt;p&gt;Durability is a key benefit of the Workflow Foundation and it is based on the ability to store a running workflow instance on the fly at almost any time.    &lt;br /&gt;To this end Microsoft workflow team implemented the SqlWokflowInstanceStore class. Using this class and a few lines is possible to store workflow instances in SQL Server as shown,&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Define SqlWorkflowInstanceStoreBehavior:&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Set interval to renew instance lock to 5 seconds.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Set interval to check for runnable instances to 2 seconds.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Instance Store does not keep instances after it is completed.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Select exponential back-off algorithm when retrying to load a locked instance.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Instance state information is compressed using the GZip compressing algorithm. &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:#00008b;"&gt;SqlWorkflowInstanceStoreBehavior&lt;/span&gt; instanceStoreBehavior = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;SqlWorkflowInstanceStoreBehavior&lt;/span&gt;(&lt;span style="font-weight:bold;color:purple;"&gt;connectionString&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;instanceStoreBehavior.&lt;span style="color:purple;"&gt;HostLockRenewalPeriod&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;TimeSpan&lt;/span&gt;(0, 0, 5);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;instanceStoreBehavior.&lt;span style="color:purple;"&gt;RunnableInstancesDetectionPeriod&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;TimeSpan&lt;/span&gt;(0, 0, 2);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;instanceStoreBehavior.&lt;span style="color:purple;"&gt;InstanceCompletionAction&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;InstanceCompletionAction&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;DeleteAll&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;instanceStoreBehavior.&lt;span style="color:purple;"&gt;InstanceLockedExceptionAction&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;InstanceLockedExceptionAction&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;AggressiveRetry&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;instanceStoreBehavior.&lt;span style="color:purple;"&gt;InstanceEncodingOption&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;InstanceEncodingOption&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;GZip&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;host.&lt;span style="color:purple;"&gt;Description&lt;/span&gt;.&lt;span style="color:purple;"&gt;Behaviors&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;Add&lt;/span&gt;(instanceStoreBehavior);&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;span style="font-size:10px;"&gt;&lt;em&gt;The above code was copied from the &amp;quot;BuiltInConfiguration&amp;quot; demo, &amp;quot;InstanceStore1&amp;quot; project. This demo is described at &amp;quot;Built-in Configuration&amp;quot;        &lt;br /&gt;(&lt;/em&gt;&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee622978.aspx"&gt;&lt;span style="font-size:10px;"&gt;&lt;em&gt;http://msdn.microsoft.com/en-us/library/ee622978.aspx)&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:10px;"&gt;&lt;em&gt;. You can download full sources of this demo and many others at &amp;quot;WCF and WF Samples for .NET Framework 4&amp;quot;        &lt;br /&gt;(&lt;/em&gt;&lt;/span&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=21459"&gt;&lt;span style="font-size:10px;"&gt;&lt;em&gt;http://www.microsoft.com/download/en/details.aspx?id=21459)&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:10px;"&gt;&lt;em&gt;.&lt;/em&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Following the same architecture our team implemented the DX WorkFlow Instance Store. &lt;a href="http://www.devexpress.com/Products/NET/ORM/" target="_blank"&gt;eXpress Persistent Objects (XPO)&lt;/a&gt; is used for common objects storage and is fully capable of working transparently with &lt;a href="http://documentation.devexpress.com/#XPO/CustomDocument2559" target="_blank"&gt;14 different database systems&lt;/a&gt;. For example to provide support for an Oracle database we could write,&lt;/p&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;&lt;/div&gt;  &lt;div style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//We create or connect to a database by setting the connectionstring &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;//&lt;span style="color:green;"&gt;This code will create 2 tables (XpoWorkflowInstance, XpoInstanceKeyc) in the database &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; session = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;Session&lt;/span&gt;()) {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;session.&lt;span style="color:purple;"&gt;ConnectionString&lt;/span&gt; = &lt;span style="color:#a31515;"&gt;&amp;quot;Data Source=DevExpressInstanceStore;User Id=myUsername;Password=myPassword&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;session.&lt;span style="color:#008b8b;"&gt;UpdateSchema&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;XpoWorkflowInstance&lt;/span&gt;), &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;XpoInstanceKey&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;session.&lt;span style="color:#008b8b;"&gt;CreateObjectTypeRecords&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;XpoWorkflowInstance&lt;/span&gt;), &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;XpoInstanceKey&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;}&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// Define WorkflowInstanceStoreBehavior:&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; dxInstanceStoreBehavior = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;WorkflowInstanceStoreBehavior&lt;/span&gt;(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;XpoWorkflowInstance&lt;/span&gt;), &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#00008b;"&gt;XpoInstanceKey&lt;/span&gt;), &lt;span style="font-weight:bold;color:purple;"&gt;DevExpressConnectionString&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;host.&lt;span style="color:purple;"&gt;Description&lt;/span&gt;.&lt;span style="color:purple;"&gt;Behaviors&lt;/span&gt;.&lt;span style="color:#008b8b;"&gt;Add&lt;/span&gt;(dxInstanceStoreBehavior);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;dxInstanceStoreBehavior.&lt;span style="color:purple;"&gt;RunnableInstancesDetectionPeriod&lt;/span&gt; = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#00008b;"&gt;TimeSpan&lt;/span&gt;(0, 0, 2);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;dxInstanceStoreBehavior.&lt;span style="color:purple;"&gt;InstanceCompletionAction&lt;/span&gt; = &lt;span style="color:#00008b;"&gt;InstanceCompletionAction&lt;/span&gt;.&lt;span style="font-weight:bold;color:purple;"&gt;DeleteAll&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;You can download a modified version of the “BuiltInConfiguration” solution &lt;a href="http://community.devexpress.com/blogs/eaf/DX_WF_InstanceStore.zip" target="_blank"&gt;here&lt;/a&gt;. The console application starts a long running workflow that implements a counting service. Once the service’s start method is invoked, the service counts from 0 to 59. The counter is incremented every 2 seconds. After each count the workflow persists so you can close the application at any time and when you start it next time it will continue. A new one will be started from &amp;#39;0&amp;#39; value in addition to the loaded instances. The second project “InstanceStore2” in the solution provides the same functionality, however it is configured using the app.config file as shown,&lt;/p&gt;  &lt;p style="font-family:consolas;background:white;color:black;font-size:10pt;"&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;extensions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behaviorExtensions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;DevExpressWorkflowInstanceStore&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;DevExpress.Workflow.Store.WorkflowInstanceStoreElement, DevExpress.Workflow.Activities.v11.1&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behaviorExtensions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;extensions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;services&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;service&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;CountingWorkflow&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;service&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;services&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behavior&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;lt;sqlWorkflowInstanceStore&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;connectionString=&amp;quot;Data Source=.\SQLEXPRESS;Initial Catalog=InstanceStore;Integrated Security=True;Asynchronous Processing=True&amp;quot;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;hostLockRenewalPeriod=&amp;quot;00:00:05&amp;quot; runnableInstancesDetectionPeriod=&amp;quot;00:00:02&amp;quot; instanceCompletionAction=&amp;quot;DeleteAll&amp;quot;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;instanceLockedExceptionAction=&amp;quot;AggressiveRetry&amp;quot; instanceEncodingOption=&amp;quot;GZip&amp;quot;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DevExpressWorkflowInstanceStore&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;connectionString&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Data Source=DevExpressInstanceStore;User Id=myUsername;Password=myPassword&lt;/span&gt;&amp;quot;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;runnableInstancesDetectionPeriod&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;00:00:02&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;instanceCompletionAction&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;DeleteAll&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behavior&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;behaviors&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="font-family:Verdana;color:#131313;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;span style="font-family:Verdana;color:#131313;"&gt;Note; All we need to do to use these code snippets in our code is to reference &amp;#39;DevExpress.ExpressApp.v11.1.dll&amp;#39; and &amp;#39;DevExpress.Workflow.Activities.v11.1.dl assemblies. Even though these assemblies are part of our eXpressApp framework and need a special &lt;a href="http://www.devexpress.com/Subscriptions/DXperience/editionUniversal.xml" target="_blank"&gt;license&lt;/a&gt; they can also be used to support any other type of .NET application!&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;&lt;/p&gt;  &lt;p style="margin:0px;"&gt;We are waiting to read your feedback about this. Remember that your questions are the best candidates for future posts.&lt;/p&gt;  &lt;p&gt;&lt;span style="text-decoration:underline;"&gt;&lt;strong&gt;Related Links&lt;/strong&gt; &lt;/span&gt;    &lt;br /&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/archive/tags/WF/default.aspx" target="_blank"&gt;Blog posts&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://documentation.devexpress.com/#Xaf/CustomDocument3343" target="_blank"&gt;Online documentation&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://tv.devexpress.com/#;WorkFlow.tag;1" target="_blank"&gt;Videos&lt;/a&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=351708" width="1" height="1"&gt;</content><author><name>Apostolis Bekiaris (DevExpress)</name><uri>http://community.devexpress.com/members/Apostolis-Bekiaris-_2800_DevExpress_2900_.aspx</uri></author><category term="WF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/WF/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>Questions, ideas for 30-Aug-2011 - “Ask the XAF and XPO Teams” webinar</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/08/23/questions-ideas-for-30-aug-2011-ask-the-xaf-and-xpo-teams-webinar.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/08/23/questions-ideas-for-30-aug-2011-ask-the-xaf-and-xpo-teams-webinar.aspx</id><published>2011-08-23T11:40:00Z</published><updated>2011-08-23T11:40:00Z</updated><content type="html">&lt;p align="justify"&gt;We would like to make our &amp;quot;Ask Team&amp;quot; &lt;a href="http://www.devexpress.com/Support/Webinars/"&gt;webinars&lt;/a&gt; more interactive and interesting. In order to do this, we want to try to collect questions and ideas from our users and address them during the webinar, rather than just waiting for questions &amp;quot;at runtime&amp;quot; or demo-ing something we planned ourselves. The next &lt;em&gt;&amp;quot;Ask DevExpress - XAF and XPO&amp;quot;&lt;/em&gt; webinar is on 30-Aug-2011 (&lt;a href="http://www.devexpress.com/Support/Webinars/details.xml?id=AskXAFAugust"&gt;click here for free registration&lt;/a&gt;&lt;font color="#000080"&gt;&lt;/font&gt;), and we would like to make the first experiment for it.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;What do you think about this idea in general?&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;If you support it, let&amp;#39;s make suggestions for &lt;a href="http://www.devexpress.com/Support/Webinars/details.xml?id=AskXAFAugust"&gt;the upcoming webinar&lt;/a&gt;, either in comments to this blog, &lt;a href="http://community.devexpress.com/forums/t/103883.aspx"&gt;the thread in the XAF forum&lt;/a&gt; or even in corresponding &lt;a href="http://community.devexpress.com/blogs/eaf/archive/2011/05/06/frameworks-fan-clubs-in-social-networks.aspx"&gt;groups in social networks&lt;/a&gt;. For instance, the next question asked in the forums seems to be a good example:     &lt;br /&gt;&lt;a href="http://community.devexpress.com/forums/t/103333.aspx"&gt;&amp;quot;Why use Domain Components in AsAlias mode instead of pure persistent objects?&amp;quot;&lt;/a&gt;, and it can be addressed in the webinar.&lt;/p&gt;  &lt;p align="justify"&gt;Thank you for your feedback in advance!&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=352417" width="1" height="1"&gt;</content><author><name>Dennis (DevExpress Support)</name><uri>http://community.devexpress.com/members/Dennis-_2800_DevExpress-Support_2900_.aspx</uri></author><category term="webinar" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/webinar/default.aspx" /><category term="XPO" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XPO/default.aspx" /><category term="ask team" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/ask+team/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry><entry><title>Case Study: Paid Access Control Systems built with DevExpress WPF controls &amp; XAF</title><link rel="alternate" type="text/html" href="http://community.devexpress.com/blogs/eaf/archive/2011/08/22/case-study-paid-access-control-systems-built-with-devexpress-wpf-controls-amp-xaf.aspx" /><id>http://community.devexpress.com/blogs/eaf/archive/2011/08/22/case-study-paid-access-control-systems-built-with-devexpress-wpf-controls-amp-xaf.aspx</id><published>2011-08-22T15:10:00Z</published><updated>2011-08-22T15:10:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;span style="font-size:10pt;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;span style="color:windowtext;"&gt;&lt;a href="http://www.devexpress.com/Home/Case-Studies/DevPark/"&gt;Check out&lt;/a&gt;&lt;/span&gt;&lt;font color="#000000"&gt; a case study from Roman Shelomanov, a developer working for a Russian company &lt;/font&gt;&lt;a href="http://www.devpark.ru/" target="_blank"&gt;DevPark&lt;/a&gt;&lt;span style="color:windowtext;"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;font color="#000000"&gt; that created Access Control software system. This system consists of an administrative module, built utilizing the &lt;/font&gt;&lt;a href="http://www.devexpress.com/Products/NET/Application_Framework/"&gt;DevExpress eXpressApp Framework (XAF)&lt;/a&gt;&lt;span style="color:windowtext;"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;font color="#000000"&gt; technology, and client (cashier) applications, built using DevExpress &lt;/font&gt;&lt;a href="http://www.devexpress.com/Products/NET/Controls/WPF/"&gt;WPF Controls&lt;/a&gt;&lt;span style="color:windowtext;"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="font-size:10pt;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;font color="#000000"&gt;Be sure to learn more about Roman’s experience with XAF and how it has helped Roman accelerate the development of LOB applications at the end of the case study. &lt;span style="font-size:10pt;"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-theme-font:minor-bidi;"&gt;We apologize for the inconvenience the absence of screenshots with English captions may cause some of our readers. &lt;/span&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;span style="mso-spacerun:yes;"&gt;&lt;/span&gt;If you wish to see more screenshots of a typical UI produced by XAF out-of-the-box, please find them &lt;a href="http://devexpress.com/Products/NET/Application_Framework/#ctl00_ctl00_Content_Content_ctl13|screenshots"&gt;here&lt;/a&gt;&lt;span style="color:windowtext;"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;. &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;font color="#000000"&gt;Wish to share your story about using our products in your projects and have it appear&amp;#160; on our web site?        &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;a href="http://community.devexpress.com/blogs/eaf/Developer%20Express%20Case%20Study%20-%20General_Template.zip"&gt;Get a case study template&lt;/a&gt;&lt;span style="color:windowtext;"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;font color="#000000"&gt; and write to us at &lt;/font&gt;&lt;a href="mailto:clientservices@devexpress.com"&gt;clientservices@devexpress.com&lt;/a&gt;&lt;span style="color:windowtext;"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;font color="#000000"&gt;!&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0in 0in 0pt;" class="MsoNormal" align="justify"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span style="font-family:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:8pt;"&gt;&lt;font color="#000000"&gt;Happy XAFing&lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://community.devexpress.com/blogs/eaf/wlEmoticon-winkingsmile_0FE49BCA.png" /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://community.devexpress.com/aggbug.aspx?PostID=352309" width="1" height="1"&gt;</content><author><name>Dennis (DevExpress Support)</name><uri>http://community.devexpress.com/members/Dennis-_2800_DevExpress-Support_2900_.aspx</uri></author><category term="WPF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/WPF/default.aspx" /><category term="case study" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/case+study/default.aspx" /><category term="XAF" scheme="http://community.devexpress.com/blogs/eaf/archive/tags/XAF/default.aspx" /></entry></feed>
