Using DevExpress MVVM Magic with WPF

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hey everybody i'm amanda with DevExpress and welcome to today's webinar using DevExpress mbb m-magic with WPF presented by DevExpress Technical Evangelist Don with EA and today's session done introduces you to a very cool mvvm framework which ships with our WPF controls you'll get an overview about what MB BM is all about plus how our framework can help you implement this design pattern to deliver state of the art WPF desktop applications FYI this session is being recorded and it will be made available on our DevExpress youtube channel we will also do a live Q&A at the end of this presentation just type your questions in the GoToWebinar control panel at any time throughout the broadcasts all right thank you so much for joining us I will now hand things over to Don thanks Amanda and welcome everybody well as Amanda already mentioned I am in this webinar I'm going to introduce you with the core principles of mvvm and I will touch a bit of mvvm so you'll have an understanding of what it does and I'm going to show you this awesome cool framework that we have so let me start with a what is mvvm and why and well nvvm stands for model view viewmodel and yeah it is a design pattern which enforces a couple of things in your application architecture to make your application more maintainable by separating the UI from the data persistence through a few model and the way that this basically works is you have your data access layer so that will be like the most right one with which s model and that can be something which is built with entity framework or our own XPO or direct SQL which store products or web services or a combination of different things and the few model is reading out that information and it will compose it in a way that it is presentable for the end-user also if updates needs to be done the few model will communicate with your data access layer and the few so the UI does not have any knowledge on how that goes under the hood and that is basically one of the things that what the few does I mean the most optimal way of mvvm based application is that a few will use two-way data-binding with the fuel model so the few model will expose properties or certain commands which can be used in the few and and that will be bound to controls inside the UI also an important aspect is changed notification so whenever something changes on the fuel the fuel model is aware of that because of that binding mechanism and well that is a very cool aspect because that means that you can develop or you can code your presentation logic in the fuel model and you don't need to do all kinds of quirk little things in the UI so for instance if you have a text box which should be enabled if you take a check box that is presentation logic and that can be developed and coded in the fuel model and you'll see a bit later how that works and yeah how we can maintain a clear you I saw the presentation layer another thing because that this fuel model is not aware of the fuel which is bound to this particular fuel model so another nice side effect of this application architecture basically is that we can just remove the field and we can do a unit test which will test several things on the fuel model because the fuel model doesn't know anything about UI and and all the logic learning specific UI related things are in the fuel model you can write unit tests to test your fuel model which is a nice side effect of this design pattern so for all of you already doing mvvm development there might be a question like why did we develop this framework I mean there are a couple of frameworks out there and they're pretty pretty good and I'm pretty familiar in WPF land so why well if you will use a WPF if you would build a WPF application like a vanilla WPF application just with the Microsoft stuff which goes with Visual Studio there are a couple of complicated aspects like surfaces and behaviors are a couple of things which are also implemented in mvvm and what this basically does is let me get back to the first slide suppose the few causes something in the fuel model to change and the fuel model needs to give the user a confirmation like are you sure you want to delete something or whatsoever the fuel model should not directly interfere in the UI and for death the fuel model can acquire a so-called service and it allows the fuel model to propagate certain UI related things like action or a dialog or whatsoever to be shown in the fuel basically and well if you would have that with vanilla WPF it will be a bit of work to implement something like that well we have that out of the box and it's really really easy to use because of all those those those good expect in that framework you will have less code in your few models which means that it is easier for you to maintain you don't have to check all the massive amounts of codes because the it's already done by us so you'll have quicker results in the end swell and yeah the last thing you'll see that in a minute we have some awesome design time support which is just too cool and it will I mean all of our WPF controls have knowledge of the mvvm framework so it will all be available through all our WPF controls which is a really really nice feature so yeah let's let's do a bit of coding and show you some of this magic so I'm going to set up a small really small application and I'll introduce you with a couple of main basic aspects of the framework because there is like a lot of stuff involved in the entire framework it's just impossible to do it like the whole framework in in in an hour so I'm going to show you a couple of nice features which will give you an impression on how much time it can save you alright so let me create a new application by using the DevExpress template gallery it will just be an empty solution but because I use the template gallery let me select WPF blank application I will be having all the references set up correctly will have a main window which basically doesn't do a lot before we continue let me make sure that the start up location of this main window is on the correct screen I am having a multi-monitor config here and it would be a bit of a shame to show this monitor this application on the run monitor all the time so with this in place we can drag in two other files I will create a folder which I will be calling data and what I have prepared here is our two files basically one of them is a track info class so I'll drag that in here and this is basically a snapshot taken out of the Chinook database which holds a collection of music tracks together with albums and artists etc you can get this database for free from CodePlex to test a bit with the a normalized database basically and for this webinar I included a track list let me put it in data as well and this is basically a collection with a pre-loaded set of tracks so we have some data to work with and with this in place I'll do a quick build so I'm sure everything is set up correctly and we can start using the first design time feature for the WPF mvvm framework all right click the solution and I'm going to say add a new DevExpress item and in this case you'll get a couple of features that you could add and I am primarily interested in the few and a few model section in this case I will be adding a track view and as you can see a few model class is being generated as soon as I hit add item I can choose the poco fuel model or I can choose the regular fuel model and well I think the most interesting part is the Polka fuel model because pogo stands for plain old CLR object and that means that this fuel model class is not derived from any base class which comes with the framework or it's not depending on any stuff and this is also a great way to share how magical this framework is basically so let me add the item and what you see is that a couple of folders are being created in the solution one with fuse and one with few models what we immediately see is that there is an infinite markup and that has to do with the fact that I need to rebuild the application because the view is unable at this stage to locate the fuel model which is you where the view is bound to so what we see now is that everything is is working properly and let me start by introducing a couple of things in the fuel model so as I mentioned the fuel model is used or basically the fuel is bound to the fuel model the fuel model doesn't care what is bound to it but it will just expose certain behavior and certain properties and so on and if the few is facilitating those it will work out of the box but this framework has a couple of things to be aware of and that is suppose we want to edit this track object I'm going to introduce a property and that is one of the things which comes with the framework we have to make sure that the property is made virtual so I'm going to make a public virtual track info object it's it has a normal get and set not in particular and and another thing is that we do not want this track fuel model to be instantiated by code by putting a new track fuel model statement somewhere we want this track view model to be created through a factory which is inside the framework so I'm gonna hide the constructor by making it a protected constructor and I'll get some data some random entity well in this case the fifteenth element out of the list and which is assigned to the track so we have some test data and as I mentioned I want this track fuel model to be generated through the factory of the framework so for that it is necessary and this is all convention based it is necessary to create a static method which is called create and what we see here is that the fuel model source is the factory class it has a method create which expects a lambda expression which allows us to create this new truck fuel model and because this code is being executed inside this class we can still instantiate this protected constructor so this is just a small thing which is absolutely necessary for this mvvm magic to to work so with this in place we have set up a very basic fuel model and if I now build the application again we can bind a couple of editors to this particular fuel model and for that I'll switch back to the track view and I can now change the grids I mean you can use whatever you like but I'm going to use a stacked panel for layouting and I will put in a couple of text editors here so let me open up the toolbox and make sure that I have the sixty point one text edit here we are and let me put two more in there and now I'll be able to bind the text property to something which comes from the track fuel model in this case I will be binding it to track ID the second one I will be binding to the name of the album or the name of the track basically and the last editor I will bind that to the composer and what you already see is that we have design time data and that is obviously because I created in memories a an in-memory data store so this will work design time as well to have this fuel loaded we can switch to the main window dot XML add a namespace here which allows us to link in any fields which are in the solution so this is going to be twelve dot fuse and I can now add a few witch's names track view well if I now run the application it will probably not be a surprise that we have this window including this particular track from ECDC well so far I haven't been like much magic well there is a bit of magic going on but we're going to extend it because this is just general binding functionality which comes with the vanilla WPF as well but let's make it a bit more interesting suppose I want to have a button on this on this control or on this view which allows me to clear the name of the track so the second text box but this button should only be enabled if there is any text in that control to be cleared if that particular control already has some data in there the box if the button should be disabled well I can hear you all think like okay so we're going to do a couple of events here and there we're going to check the value of the box but no we don't want to do that because we want to have all the UI logics build into the fuel model so let's start with that let me close the application and get back to the fuel model like this what I'll do now is I will implement some code here which has a specific purpose I will create a public boolean method which is named can reset name and this is basically a constraint or a check whether the name property can be reset and it can only be reset if there is an track object assigned to this fuel model and if the track name property is not empty and as I mentioned before it is convention based so I'm going to implement another method which actually clears the name property of the track and do note that I have a public boolean method which starts with kin and then something behind it and I have a method which has the same portion here you see and this is where we start doing some cool stuff because what I can do now is let me quickly rebuild the application and now let's get back to the fuel and what I'll do here is I'll implement a tool panel which is also from the DevExpress control set so that would be a toolbar control and ok so now I put it on the bottom but let me put it on top to make it a bit more prettier and what I'll do here is I'll add an item it's going to be a bar button item if I now select a bar button item I can change the caption to clear name and what I'm going to do now is I'm going to bind a commands because if I click this button something should happen and in the normal or like in the nominal vvm way we would like double click this thing and code in an event but we don't want to do that we don't want to have any code in the few so I'm going to bind this and what you see here is very interesting because there is a reset name command and if you remember I implemented a method reset name and this is where the magic begins because the framework has already created a command for this particular method and not only that let me just hit this okay button and run the application what you'll see is some other behavior on the UI as well and I did not do a lot for it if I clear down this box and I will move to the next control you will see that the button has already been disabled so there is one thing that I don't like on this particular behavior and that is as soon as this editor is empty I want that state of the button to be updated now it will only be updated once we leave the editor so the actual property has been changed but we can change that fairly simple if I just close down the application and I'll go to the text box I can change some properties on the binding so I'll let me open up the binding dialog again and I'll put the binding back on track that name but what I'll do now is as you can see the update source trigger is default which is on lost focus which is what we just saw if I now change it over to property changed and hit OK if I now run the application you will see that it does exactly what I want and that is if I clear this box by using the backspace key as soon as it gets empty the state of the button gets updated I start typing again the button is enabled again so this is where it gets interesting because this behavior is coded in the fuel model by implementing this method so a public method in the fuel model will be transformed into a command which is important to remember and I put a constraint on it as well the chem reset name so whenever that reset command can be executed that will be automatically be updated through the particular controls so I'd say this is fairly simple to implement and you'll have yeah a whole bunch of events and checks what you normally would have done replaced by just the simple piece of code all right but let's let's take it a step further I was mentioning before that there are things like surfaces and behaviors so what can we do with that in this in this simple demo well as I mentioned also the few model class is not allowed according to the mvvm design pattern to communicate directly with the UI and so let me give you an example suppose if I hit that reset name button I want a confirmation I want to have a dialog which states are you sure you want to clear it and that would be initiated from the fuel model but again the fuel model shouldn't be dealing directly with UI related tasks so for that we can implement a so-called surface which allows us to post a surface message through to the UI and it will still allow us to generate that confirmation so we can do that by using the following approach i'm going to implement a property and check what's happening here it's going to be a protected spiritual so it's got to be virtual again because we're going to add some flavor and some spice to it at runtime through the factory and you can even see that it returns nothing the property just needs to breathe and it's of a type I message back surface which comes from framework I have also decorated the surface property attribute on this property and that determines how to locate any existing surface which might already be there to improve the performance of the application in this case it Allah I'm allowing it to search through parents of this few model as well and you can read quite a bit more about it on our documentation and next I can do a small change because I have implemented this message box service property I can now make a small change here as I mentioned I can now pop that message up on the surface by calling the show message method which comes with a message box surface and well the show message parameters look pretty familiar probably so I'll now share this confirmation box and if we click yes the track name will be cleared but before we can actually run the application to test this we need to implement this behavior on the fuel and the fuel should be aware of the fact that this message box surface might be used or yeah might be used from the from the fuel model so let me switch back to the track view and select the control and here I can use one of the other nice design time features which come with the mvvm framework I can now switch over so I can also go to the surface link and what you'll see here is there is this dark DX message box surface and by implementing it just like this if I close this one down and look at the XML code you will see that this is basically the only decorate declaration which is added to the XML and this means that this fuel model is able or this fuels a row to deal with the messagebox surface and with this in place let me run the application again and if I now hit this button will have the confirmation are you sure you want to reset so what basically happened on the background is that I pushed this particular behavior back to the UI and once I click that button this confirmation will show up so if I now hit no it will be what it was if I click yes it will be cleared and as you can see the clear name button is also disabled because it was empty so we have done some of the UI logic but all coded in the fuel model and the few only has a number of bindings to the fuel model let's take it a step further and let me introduce another few which will hold a list of all the tracks available so I can now right click add a new DevExpress item I want to have the feel and the fuel model and this is going to be the track list view together with the track list fuel model so here it is again yeah at the first stage it is unable to locate that that track list fuel model so let me build it and we'll get some stuff in the designer so once that is done it should update pretty quickly here we are and I can use one of the other features that comes with the WPF controls of that Express I can now use this functionality too quickly at a crit because I want to share a list with tricks I want to have it as a table view and in a matter of seconds will be having the grid available we do need to change a couple of things in the few model clouds as well so let me do that first by adding a number of things here and I'll be adding a couple of things which shouldn't be a big surprise I will add a virtual property which is an instance of the tracklist so it will have all the tracks that's our data in this case as I mentioned before I will hide any public constructor by putting in a protected constructor and I will create this static create methods which allows us to create or instantiate this to a few model through the factory of the framework with this in place if I quickly rebuild I can assign the grids that I already put on the fuel model or on the fuel let me switch over here and I can bind the item source collection to the tracks property of the fuel model so here we have the tracks as you can see because it was in memory data we already have data available and I'm going to disable the allow editing because we're going to make it a bit more interesting slightly later I will now change the main window markup to make sure that this will be the startup view being loaded so I can now change this to track ListView and with this in place if I run the application we'll have a grid containing all the tracks so all very nice what I want to change now is that if I double click any of those items I want to have that an editor to be shown which will contain the track view which we developed earlier which will be used to edit any of those entities so for that I will need to do a couple of things I need to coding something which if I double click the item on the grid something should happen and we will not be using code behind to code in on a double click event but will use it like the mvvm way so we need to double click we need on the double click event basically to execute a command on the fuel model so let me first and there is another thing that we need to do because we are going to show something from within the fuel model so the fuel model will initiate something which will show the editor dialogue with all the other fuel so well what we have done before we need to change something or we need to add something to the track list you model which I will be doing now I will implement the I document manager service property which is something that we have done in the other field as well for the confirmation dialogue so again I'm just going to implement that property and I will return nothing because that will be handled runtime and I'm going to implement a command or basically a method which will be transformed into a command which is called edits track and that edit track can be as simple as the following what you see here is we are passing in a track object and this is a generic object so we'll cast it over to a track info object and we're going to acquire we're going to create a document and this will actually be this this window that we will be creating it's called a document basically well we will load in the track view with a new instance of the track view model where we pass in the currently selected track but if you remember this track view model and you'll also see it in code that create method doesn't allow us to pass in any parameters so how are we going to do that well it's not too difficult because we can just add like an extra constructor and we can add a second create method which will get that track as a parameter so for that we need to go to the fuel model of the track and we need to add this extra functionality right here so for that to happen I will now implement this extra protected constructor we don't want to have this instantiated somewhere in code and I will actually check if this is if this track is being set to something useful and I will also call a method load or code that in and we're going to use that a bit later and we can also rewrite this methods to be a bit more optimum I can change this over by calling the the other constructor that I just created which is basically the same well as I mentioned we also need to create an extra static create method which will accept a parameter and this is one of the cool things as well because the framework will determine if there is one of those create methods which will have this parameter and it will pass it right onto the correct methods so with this in place there is only one thing that I need to code in and let me do that straight away and that is I will create that load method and I could also assign the track thing too directly but let's do it through this method because I will be expanding this a bit later and it's going to have a track info track and in this case I will be assigning this dot track with this one being passed in and with this in place I only made a couple of smaller changes to the track fuel model and it is now enabling me to pass on in this case to select a track from the grid so before we can use this again we need to make sure that that document surface is available on the few of the track list so if I switch back to the track list fuel I need to add that behavior section here and and that is being done by SEP making sure that we have the control selected I go to the little wheel and I'm going to add the window document UI service what you see here is that this is also been added to the control and I do want to set a couple of extra things here so let me expand this and put a couple of things in here and that is I want to open that window with some specific dimensions so I can just expand this and put this code in and it means that if the target is a DX window which will be the case because we're using that document service it will set the properties width and height you could also set the title or more stuff but in this case I want to have to within the height set of 300 pixels so we are now able to show that document that was created in the fuel model there is one other thing that we need to do and that is we need to yeah trigger the double click event we need to map that to a particular command and that can be done by Express doing this here and what I'll do here is something which comes with the framework as well and that is a so-called event to command section let me paste it in and this is one of the things that you cannot do through the designer you cannot select this table field so I'm going to paste it in but it will probably be pretty clear what it does I will map the double-click events on the grid and I will bind it to the Edit tract command and the edit track command causes the edit track method which we code it in to be executed there is one thing before this all starts to work I mean the current item is one of the parameters in the in the in the original event handler and it is based on the grid the element name grid but before this is going to work I need to assign a name to the grid which will be grid and well what we have now is that if a double click event happens on the grid will be binding that to the Edit track method in the end and the Edit track method which coded in here it will come down to this particular place so if I now build the application we'll have this grid let me make it a bit bigger and if I now double-click this we will have a pop-up window which allows us to edit this particular entity and if I now start change this you will see one thing which might not be desirable and that is that the entity in the grid is also updated directly and that is because they are actually pointing to the same physical object and and this might not be desirable well I guess it's not you do want to have like a confirmation button and a cancel button to undo your actions in case of an error but what does work which is pretty funny is if I hit this button this behavior still works if I do yes the button is disabled as well so I made a couple of minor changes here and there and we are now having like a full application with a pop-up in as well as a grid but yeah let me make some more changes that we will have this confirmation or this cancellation when you prefer and before this is being posted back in the actual data store so or close the application and besides this behavior that we want to change there is also one other thing which I which is a reason to change this anyway because what we see in the trek fuel model is that we are binding directly to properties of this data object we are binding directly if I move down the properties of this data object and that is something that we don't want to happen in an mvvm application so this is where the power of the fuel model comes in because this also allows me to hide certain properties that I will not be using or I can transform properties in the fuel model to be perfectly suited for the UI at that particular stage so what I will do is I will introduce a couple of properties on the fuel model and I will be binding those editors to those properties instead so let me go to this truck fuel model and I will start by changing this into a lower cap property and I will make this private so everything is now being updated thanks to code rush and and I now have this private virtual track and I can also remove the virtual class obviously because it's private and what I will now introduce is a number of properties which I will be using in my UI so let me get down here and these are just the virtual properties because I say conventions the framework it's got the track ID the name and composer just simple get sets and I can also expand the load methods and this explains why I was creating the load method in the first place to update those properties and to make this work out of the box straightaway I can go back to the fuel and change the blinding here because the track doesn't exist anymore so I can now directly bind them to the properties in the fuel model so I have separated the data object from the UI by introducing those properties well I also want to continue by using this okay and cancel button behavior so to do so I'm going to implement a particular interface on this fuel model and this is just a standard interface which comes with the dotnet framework and that is the I editable object as you can see it's coming from the system that component model so I'm going to implement that interface and I'm going to implement it explicitly and the reason that I'm going to implement this explicitly is because the methods begin at it and edit and cancel it I don't want them to appear as commands on the fuel model because if I would create a public method that would be transformed in in a commensal and I don't want that to happen so I'm going to implement this interface explicitly and this make sure that they will not show up as comments in my fuel with this in place we can code those particular methods and they are pretty straightforward I mean with the begin edit I'm not going to do anything here so I can just remove this one with the end edit I'm going to do a bit of coding because if the end edit occurs the properties of the fuel model needs to be copied in into the properties of the data object but only if they have been changed so nothing has been changed nothing needs to be copied over so that would look a bit like this just checking and copying over if necessary if the Edit would be canceled everything should be referred back so I can just call the load method and pass in the original data object which was already as a private member available in the fuel model and now I want to have those those buttons let's do this safe and the referred so I'm going to implement a method which is called public or for it's safe and I'm going to do a public for its referred and to not have any duplicate code I can just call the and edit here and I can use the cancel edit here and because I explicitly implemented the interface I need to cast the objects which is doing all this stuff I need to explicitly cast it over to Anne I added what object all those methods are not to be found so I now have implemented this editing functionality and I separated the UI modifications and stuff by introducing those properties and I keep track of the original object let me just add an e to make the revert look like refer it and the last thing I can do now is after a quick build I can add a number of buttons to the UI so I can go to the track view and I am going to add a number of but this wrench and at a bar button item and add another one this button will be the safe button which will be bound to the safe command and the other button will be the cancel one and that one will be bounced to the reference command and with this in place we are able to run the application and we'll have a grid with a separate pop-up which allows us to edit the data so here is our main window let me make it slightly bigger if I go to this particular record I'll have it here and if I now start changing it you'll see that the group the underlying grid is not being updated if I hit cancel it will be restored to the original failure if I do the clear name one this behavior still works because we didn't change any of those if I do cancel it will be referred it and if I pick any of the other ones if I hit save you'll see it's being updated and now I did clear this one which was not the brightest idea if I hit save it is being updated in the grid and with this demo I hope that you will get a good impression on the power that is being provided by our mvvm framework and it will take care of quite a lot of things under the hood yeah by using this approach amenda um are there any questions here's a question for Matt is this the same framework the scaffolding Wizards are built on yes this is actually we have the the scaffolding framework and the again there was not enough time to go into that particular area but if you're interested we can do something we can do a webinar on that particular area as well we have some some scaffolding based on an existing database and it will compose an application which is based on this framework and it will take away quite a bunch of of coding more for you basically yeah um how let's see from Stefan what in your opinion would be a best approach to validate the data in the MVVM pattern well I think the best way would be to perform that through the few model yeah I mean a lot of obviously the editors will have validation rules with them but all the logic behind it like if you have conditional validation on particular editors that should be taken care of in the fuel model basically that's where all your prop your UI logic is coded basically um can we get the source code of this example yeah obviously I will make sure that it works before putting it up I'll put a blog post down I will probably be on there tomorrow and I'll put a link with the source code as well so you can play around with it it only needs to DevExpress version installs what about the unit test could we possibly have a quick example at this stage I am unable because I don't have a working version right it might be interesting it might be interesting to maybe do a webinar on the unit testing on this particular area but yeah drop me a mail with your question about it and we you might put a webinar together about that can you explain the purpose of the virtual property yes excuse me okay so I was mentioning it is one of the things that is necessary to use this mvvm magic basically the property needs to be virtual because what happens if we instantiate a if we instantiate a new few model through this Factory we what we actually do is we create a descendant class from this particular class and we add extra methods and extra stuff to this to depth derived a few model and that is something which allows us to add commands and all that kind of stuff in the way that we are doing it right now so we will add in quite a bunch of stuff which makes all the magic happens and if you wouldn't make that property virtual we couldn't do a lot with it in the derived classes so that's the reason why you have to make them virtual and you have to hide your constructor and you have to use this construction to create a new instance of this particular few model to set the data context should it be possible or is it possible to setup programmatically it should be it should be possible to set it programmatically but yeah in this case we are using this to give you all the DS on time fear so I'm not entirely sure if that would work if then the design time features would all work if you would set it programmatically I guess it does but okay um let's see um is there an example of having a tree object in mvvm that is a good question um like a directory list sure if we have any other demo on the demos section let me have a quick check because we obviously have our sample applications but not all of them are set up with this mvvm framework but let me see if there is a demo of the of a three now we do have a tree map I'm not sure if we have that demo but yeah if you want to know more please drop me an email and I'll see if I can now come up with a small demo for you that's not not a big deal um and then let's see ah well here's a loaded question as a wind farms developer do you recommend changing the WPF from Pedro yeah that is a obviously a very tricky question I mean it it depends on on like it depends on on your knees I mean if you have like an application which you are working on for like the last ten years and it's like massive and it's like incredibly big and complex I wouldn't even bother changing over but I mean if you would create like a new application and you want to take advantage of like a scalable rendering engine you want to take advantage of some newer features like mvvm is something which is pretty difficult to chief in WinForms yeah then it might make sense to switch over and I mean our controls are as well available for wind farms and WPF so if you use our controls you're already on your half off on your way basically yeah again I wouldn't I couldn't give you a straight answer like yes do or no don't it depends on your situation sure the team is saying yeah you can use practically the same techniques for our wind farms controls that is true because we do have a similar library for wind farms but I will not go too far into that right now from Torben other nvvm frameworks use an ioc container is there any ioc container involved in this framework there are some some links available well for instance one of the very very famous mvvm frameworks is windsor castle and i forgot the name of the other one but we you can you can steal those kind of libraries together with our with our mvvm especially the poco fuel model technology and i will put up a couple of links about some some use cases which are using ioc containers together with with our mvvm framework Laurens asks is there a way creative members dynamically like reset name and can reset name is there a pattern or just reflection uh that is a good question which I cannot answer right now I I have to get back on that please drop me an email and I'll get back to you about it and then let's yeah we're out of time glasses want well me asks in one line what's the major difference between NBC and mvvm yeah that is the that is the extra fuel model class basically I mean model-view-controller is a controller you put a few and it controller put some data in that few and vice versa mvvm has like this extra few model which has all the logic inside it and it is it looks a bit similar it looks pretty much the same but this is like a step further in separating concerns and stuff all right cool that's it all right perfect Thank You Don you're welcome all right everybody you can check out ded express.com slash webinars to see recordings of all of our most recent webinars and to keep up-to-date on upcoming sessions and let me mentioned previously today's webinar will also be available on our DevExpress youtube channel the link is posted in the chat box and that is it for this one thank you so much to Don thank you all for joining us and of course thank you for choosing DevExpress bye bye
Info
Channel: DevExpress
Views: 32,106
Rating: 4.5047617 out of 5
Keywords: Developer Express, DevExpress, MVVM, WPF, desktop applications
Id: -LL1UdHFkjc
Channel Id: undefined
Length: 64min 8sec (3848 seconds)
Published: Wed Aug 24 2016
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.