|
Not finding any good explanations so far... trying to figure out CompositeCommands & IActiveAware. I understand that the CompositeCommand is a static "shell" command and as part of your VM init, you attach the "local" command to the "shell" command via RegisterCommand(). That part makes sense.
The part that doesn't is IActiveAware.
From the source code for CompositeCommand, it seems like the "local" Command is supposed to implement IActiveAware. However, if I have 100 commands, I would need to implement it 100 times. Google searches seem to mention that only the VM is supposed to implement IActiveAware and something about the region manager???
How does the region manager tie in the IActiveAware on the VM into a non existant one on the "local" ICommand? How does the IsActive get set on the commands "automagically"?
|
|
|
|
|
I am developing a MVVM application using C#. I have a property called 'ReportedDate' of type DateTime which is optional in database field. In my view I have bound 'ReportedDate' property to txtReportedDate text box.
After getting data from database, if there is no value in ReportedDate field, I want to display blank in txtReportedDate text box. But empty values cannot be assign to the property 'ReportedDate' in ViewModel. It gives errors.
How can I do this?
|
|
|
|
|
By itself, a DateTime cannot be null. To make it a nullable type, use DateTime?
|
|
|
|
|
Could you please give an example?
|
|
|
|
|
I already showed you. The question mark after the type made it nullable.
|
|
|
|
|
You might need a value converter as well to box and unbox the nullable DateTime. The framework will not directly cast DateTime? to DateTime.
|
|
|
|
|
Could you please give an example?
|
|
|
|
|
why not choosing a nullable type or making a valueConvert when binding
|
|
|
|
|
I have a main window (ribbon). The ribbon has 2 buttons. Call them BtnA and BtnB. The view area is a tab control. Tab1 and Tab2. Each has a user control. UserCtrl1 and UserCtrl2. So BtnA should execute Cmd1 in UserCtrl1 and BtnB should execute Cmd2 in UserCtrl2.
So the question is, what is the cool MVVM way to set that up? The main window doesn't have the data context for the user controls, so it can't do straight up binding. I could have Cmd1 and Cmd2 be static commands, but then you end up with 2 sets of functions... a static Execute & a class Execute, a static CanExecute and a class CanExecute. Not good. Could also have forwarding functions in the main window, but thats pretty much the same issue. 2 sets of functions.
|
|
|
|
|
Effectively, you can tackle this using a Mediator or Messenger. The buttons trigger messages that the tab view models hook up to. The beauty of this is that the whole implementation is nicely decoupled.
|
|
|
|
|
Yeah, thats even messier. Gotta sub to msgs, create a payload class, etc.
Was reading about composite commands. That seems to be a pretty slick solution. Still requires the 2 command solution, but its a bit more generic on the forwarding logic and has the built in switch to handle IActiveAware.
Playing around with them now.
|
|
|
|
|
A neat way to address this problem is to divide your screen into logical groups called Regions.
This is typically done via using Prism.
Once you have your regions defined, you can plug views in and out of the regions on demand.
Prism works well with MVVM and Silverlight.
|
|
|
|
|
Hello,
On my WPF App in the main window i have a treeview control on the left and a border control on the right,
I want to display different user controls in the border according to selected item in the treeview using MVVM pattern.
Didn't find any good example, can any one guide me?
Thanks
|
|
|
|
|
Put a content control inside of the border and bind it to a content property on your ViewModel. Use the Interactivity library to attach a command to the selected node change event or the EventToCommand helper in MVVM Light. In either case, the command handler in your ViewModel will set the content property on the VM to an instance of the user control you want to display. The binding will automatically pick it up and display it inside the content control.
Your user controls can each have their own view model to handle their functionality. In this way you essentially swap encapsulated views/viewmodels in and out of a container at will.
|
|
|
|
|
Thanks for the answer,
One question though, if i will set the an instance of my control inside the VM ,that means that my VM has to know about the different controls,doesn't it against the MVVM pattern concept(the view is isolated from the model,the view have reference to VM but not the other way around)?
Thanks
|
|
|
|
|
Not really... Let's say you have three user controls; myControlA, myControlB, and myControlC. You have a MainPage with a tree view and a content control. The selection change on the tree view is passed back to the main view model via an ICommand just the same as a button or other view event.
The content control is bound to a content property on the view model which is implemented as a dependency property (required to support the bindings).
When a node is clicked on the tree view, the ICommand fires a method on the ViewModel. That method, in turn, creates an instance of myControlA and assigns it to the content property:
myContentProperty = new myControlA;
Because the content control's content property is bound to your content dependency property on the VM, it detects the change and updates the content presenter area with the new instance of myControlA. In your method to determine what gets loaded, you simply decide if you are creating an instance of myControlA, myControlB, myControlC, etc.
This doesn't break MVVM because we aren't creating a dependency on the user controls. You could, in fact, create a content object and assign the template xaml all in code then assign it to the content DP making it show on your form. In that case, the view doesn't even exist until runtime! If you took the view model and fired it up in a test harness, you would execute the ICommand and test to see that the content property gets set to the proper user control type. The fact you can do that demonstrates we didn't break MVVM.
The separation of concerns is to enable encapsulation and testing. Your view in this case is your main page and the VM is your main VM. You can't have a reference to the main view in your view model... that is a no-no... But creating a sub-view (which is itself encapsulated) is encouraged. In fact, if you look at the way App.xaml is setup, it does the same thing. Your app is actually rooted at app.xaml and mainpage.xaml is a sub-view of app.xaml.
The important thing, however, is to make sure that your sub views (the user controls) DO NOT have any bindings to the main view model. They should each bind to their own view models. While it isn't strictly against the rules to bind the sub view to the main view model, it makes it easier to keep things straight with the data contexts.
HTH!
|
|
|
|
|
|
I am new to silverlight MVVM technology. I am trying to creating an small app.
1.three textboxes which accept Ripee,Dollar,Pound.
2.When i entered any value to textbox, the other two textbox shold display corresponding currency .
|
|
|
|
|
You do this using data binding.
Bind properties to all three text boxes.
On the change of the first textbox, calculate currency and update properties attached to the other two textboxes.
|
|
|
|
|
can you please share some sample code.
|
|
|
|
|
|
|
thanks but still struggling for viewmodel
|
|
|
|
|
hi
i want using bordercolor animation
but i have many problem
To implement this, I spend a lot of time, but did not succeed.
when I put on the border, event does not occur , or
can not use the color property, or
changes in the text as far as border.
How one second over the border to change the color
of the animation could be used to
this is my failed my source
<Storyboard x:Key="MouseOver">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="BorderBrush.Color" >
<LinearColorKeyFrame KeyTime="00:00:1" Value="#FF4387FF"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Border x:Name="border />
<BeginStoryboard >
plz
help
me..
|
|
|
|
|