Hi Team,
I was following the sample MVVM WPF application from msdn. Everything seems tobe fine and closely a good sample to follow, but I was looking for opening a child window as Dialog from Menu -->open and thought a text input assing the input control to my child window tab and to the text control in usercontrol customer add, but couldn't find a solution. http://msdn.microsoft.com/en-us/magazine/dd419663.aspx link for the source any help on this would be of gr8 help.
Window1 win1 = new Window1();
win1.ShowDialog();
Window1 is the child window.This is a way to make child window to act as Dialog. If you want something like to fire Command from Parent window UI to its ViewModel then this ViewModel send message to its .xaml.cs file and then open Child window as dialog then go through MVVM Light API's. They provide way for communication from ViewModel to View.Go through this only if you want to follow strict MVVM pattern otherwise you can directly fire event from UI. I hope this will give you an idea.
here is an easy way to have dialog with mvvm.
all you have to call in your viewmodel is:
var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);
Related
I have a WPF application. I'm trying to modify it to use the MVVM pattern.
Now, in the code behind of my main window, when I click a button, I change the "Content" of my window with a WebBrowser control :
Content = webBrowserWrapper.WebBrowser;
I would like to do it from a command in my ViewModel. How can I access the "Content" property of my window ?
If it's not possible, what is the simple way to modify the content of my window (maybe create a new window and navigate to it)
The principal behind MVVM is that UI is the concern of the View, and logic is the concern of the ViewModel.
You describe a concern of the View, which is properly handled within its codebehind. There is no need to involve the ViewModel in this action.
So, in other words... congrats. You're already there.
I have a MainWindow in my WPF app.
This MainWindow has a menu on the left and when a menu option is selected a UserControl is loaded on the right.
This is similar to Master Pages in asp.net
What I want to do now is to have a modal window show from the UserControl which will only allow the user to interact with the modal window.
I have seen examples of the Main Window showing a modal window (http://www.codeproject.com/Articles/36516/WPF-Modal-Dialog) but not sure on how to load this from a UserControl.
There's this: dialogs and mvvm but this is the best example I've seen of dealing with it: mvvm and closing forms
The first link I've not used and stumbled across while looking for the second link to post that here. The second link has two downloads, you can ignore the _service download, it's basically the same.
One way in WPF is this method
Add a new Window to the project.
Add other controls onto the window as needed.
In XAML name the window such as x:Name="MyWindow"
Put on Dependency properties on the window and have each of the controls bind to the window's data context such as {Binding MyText, ElementName=MyWindow}. (Note I still use, even for WPF these Visual Studio code snippets to add different dependency properties, these save time for a very redundant operations of adding them: Silverlight Snippets.
In the location where you want to launch the model dialog use this example:
Example:
var about = new About(); // Create the new window
// I've added a CompanyName dependency property.
about.CompanyName = "OmegaMan Industries";
about.ShowDialog();
I'm working in a WPF project, which basically is a class library project that implements the MVVM pattern. For clarity purposes I'm gonna say that I just have a single window with a single textbox control on it.
Now, I'm adding this dll to another project, which is a Windows Forms project, and I'm calling the window with the textbox control from this project.
In my Windows Forms project I have a single window with a button on it that calls the WPF window when I click it, and also, before showing the WPF window, it makes the WPF window its child and then shows it.
This is the code that I'm using for calling my WPF window:
MyWPFWindow wpfWin = new MyWPFWindow ();
WindowInteropHelper helper = new WindowInteropHelper(wpfWin);
helper.Owner = this.Handle;
wpfWin.Show();
This code works good and it shows the WPF window, however the problem is that when I try to enter text in the textbox control I can't. The "delete" and "backspace" keys do work, and
the curious thing is that if I use ShowDialog() instead of Show() then everything works just fine, but I can't use ShowDialog() because I need to have access to the parent window.
Can anyone help me figure it out why this is happen.
Thanks!
You need to call ElementHost::EnableModelessKeyboardInterop passing in your WPF window instance. This installs a message filter in the WinForms message loop which forwards all the input to the WPF window when it's active.
So here's what your final code should look like:
MyWPFWindow wpfWin = new MyWPFWindow ();
WindowInteropHelper helper = new WindowInteropHelper(wpfWin);
helper.Owner = this.Handle;
ElementHost.EnableModelessKeyboardInterop(wpfWindow);
wpfWin.Show();
How do I open a XamWebDialogWindowon button click in silverlight. I am using a MVVM model and capturing button click in Controller
The control you talk about is from the Infragistics suite,
there's a really good link here for the detailed explanation of how the control is used,
but to answer your question
//From the View.cs
XamWebDialogWindow myDialogWindow = new XamWebDialogWindow();
this.LayoutRoot.Children.Add(dialogWindow);
This cannot be done in the ViewModel and should not, i like to set the DataSource of the popup window to the current ViewModel so i only need to deal with one DataSource once the popup occurs
XamWebDialogWindow myDialogWindow = new XamWebDialogWindow();
myDialogWindow.DataSource = this.Resources["DataSource"];
//Where "DataSource" is the x:Name of the DataSource on your parent xaml
If you really want to popup the window from your ViewModel, for whatever reason, there are ways, yes you can
I have implemented my MVVM error message as a message dialog that subscribes to error messages via a mediator class, so that other viewmodels can notify it if any errors occur.
When an error occurs, I set the visibility attribute in the viewmodel to Visible, to display the error window. This is all bound in the Error window from the viewmodel.
However, this window is NOT modal! I need to show it as a dialog and not just set the visibility to true - is there any kind of binding I can do, even if I have to extend the functionality of the window? I'd rather not break MVVM if I can avoid it.
Thanks!
The View/ViewModel split is meant to divide look from functionality. I firmly believe the Window is functionality and look rolled into one. For instance, what if in your ErrorMessageViewModel, you had this code that executes when there are errors:
class WindowViewModel : Window
{
}
.
.
.
WindowViewModel newDialog = new WindowViewModel();
newDialog.Content = myErrorListViewModel;
newDialog.Parent = mainWindowViewModel;
newDialog.ShowDialog();
So the contents of the dialog is the ViewModel for your error list. Define your View as a data template that automatically applies itself to the error list ViewModel.
Doesn't that look like MVVM?
The fact is, the Window class is a ViewModel for the Window you see on the screen. By changing the properties of the Window object, it affects the "view" just like if the properties of the WindowView were bound to a WindowViewModel. The only thing missing is the ability to "restyle" the Window using WPF, and it doesn't matter how hard you try to implement it, you're not going to be able to do that. The user can restyle a Window by modifying their desktop theme, but you're not in control of it. The best you can do is turn off the chrome and/or make it full screen.
You find an example how windows (don't matter if they are modal or not) are shown, in the ViewModel example of this project:
WPF Application Framework (WAF)
http://waf.codeplex.com
I am also working on a MVVM project where I need modal dialogboxes or messageboxes. I have found the following way of solving it:
The software uses only one window. The layout root element is a Grid with no row- or columndefinitions. The grid has three children:
A dockpanel that contains all the usual stuff like menus, tabbed views, status bar and so on.
A grid that has a gray background and a 50% opacity. This is used as a veil to cover the dockpanel when a modal box is in effect. The veil grid is usually collapsed.
A grid holding modal views, this is usually collapsed.
The viewmodel for the main window has a member called Modal. If this is null, the two grids for modal use are collapsed through databinding and a converter for Visibility.Collapsed.
When the program wants to display for example a modal message box, a MessageBoxViewModel is instantiated and assigned to MainViewModel.Modal. The MessageBoxViewModel has a Command for an OK-button. This Command raises an event that sets the MainViewModel.Modal to null again.
The veil grid occludes the main DockPanel, so that no controls outside the Modal control accept input.
Your program can either run a messagepump until OK is pressed, or the OK-Command can trigger the next. There are many ways of solving different needs, but the Model-ModelView solution should support them.
I feel that this is as good a model of the view in the modal mode as one can hope for.
I made a behhavior to tie some modal dialogs to the command.
http://www.clr-namespace.com/post/MVVMModal-dialog-before-running-Command.aspx
<Confirm:Confirm IsConfirm="{Binding ElementName=checkBoxConfirm, Path=IsChecked}"
Command="{Binding Path=ButtonCommand}"
CommandParameter="{Binding ElementName=textBoxParameter, Path=Text}"
ConfirmMessage="Are you sure you want to fire the command?"
ConfirmCaption="Question" >
</Confirm:Confirm>
In my recent blog post you can find simple solution for Modal Dialogs and Message Boxes in MVVM for Silverlight but this can be simply reused in WPF:
Modal dialogs with MVVM and Silverlight 4
i'm using the same method as Scott Whitlock.
there is just one more important property to set:
class ModalDialog: Window
{
}
.
.
.
var dlg = new ModalDialog {
Content = viewModelName,
**TopMost = true,**
Parent = mainWindowViewModel
};
dlg.ShowDialog();