Meilleur auteur de réponses
[MVVM]Comment contrôler soi-même la création de la classe MainWindow en WPF/Silverlight ?

Question
-
Bonjour,
J'ai trouvé des codes d'exemple d'applis WPF dans lequel dans la fichier App.Xam.cs, on avait ceci:
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var viewModel = new MainWindowViewModel(); var mainWindow = new MainWindow(); mainWindow.DataContext = viewModel; InitTrace(); mainWindow.Show(); }
Et donc on controle soi-même la création de la classe MainWindow. Quand j'insère ce code dans le mine, évidemment il me crée deux fenêtres ! Et je n'arrive pas à voir ce qui diffère dans mon code et celui des exemples.Eventuellement, peut-on faire cela également en Silverlight ? Parce que je ne vois pas trop à quoi sert la classe MainWindow en Silverlight...
Cordialement
Philippe
Réponses
-
Bonjour,
En SilverLight, l'objet Application a une propriété RootVisual.
Ce code devrait marcher:
namespace SilverlightApplication { public partial class App : Application { public App() { InitializeComponent(); this.Startup += this.Application_Startup; } private void Application_Startup(object sender, StartupEventArgs e) { MainWindowViewModel viewModel = new MainWindowViewModel(); MainWindow mainWindow = new MainWindow(); mainWindow.DataContext = viewModel; InitTrace(); this.RootVisual = mainWindow(); } } }
- Proposé comme réponse Christophe Argento lundi 29 novembre 2010 19:32
- Marqué comme réponse PhilTheGap mardi 30 novembre 2010 07:45
Toutes les réponses
-
Bonjour,
MainWindow correspond à votre View et doit être de type Window, et MainWindowViewModel à votre ViewModel qui doit être une simple classe. Donc normalement la seulement fenêtre qui doit s'afficher est MainWindow. Votre ViewModel va permettre de renseigner le DataContext de votre View.
On peut faire la même chose en Silverlight, mais la MainWindow sera un UserControl et MainWindowViewModel sera toujours une classe.
Audrey - http://blogs.developpeur.org/audrey/ - http://msmvps.com/blogs/audrey - “This forum post is my own opinion and does not necessarily reflect the opinion or view of Microsoft, its employees, or other MVPs.” -
Merci de votre réponse mais je crois que je me suis mal exprimé.
Mon but est de ne pas laisser le projet WPF par défaut créer une instance de la classe MainWindow, afin de pouvoir y attacher directement son DataContext. Je vois que c'est possible mais je ne sais pas comment faire, même si pourtant j'ai des codes d'exemple sous les yeux qui le font en overridant OnStartUp. Moi si j'override le OnStartUp je crée deux MainWindows !
Ça m'intéresserait surtout de le faire en Silverlight car je ne comprends pas l'utilité de la classe MainWindow en SL (elle correspond à quoi graphiquement ?), et surtout je ne sais pas quand elle est créée. Est-ce dans son constructeur que l'on doit mettre les fonction d'initialisation ou dans celui de la classe App ?
Cordialement
Philippe -
Bonjour,
En SilverLight, l'objet Application a une propriété RootVisual.
Ce code devrait marcher:
namespace SilverlightApplication { public partial class App : Application { public App() { InitializeComponent(); this.Startup += this.Application_Startup; } private void Application_Startup(object sender, StartupEventArgs e) { MainWindowViewModel viewModel = new MainWindowViewModel(); MainWindow mainWindow = new MainWindow(); mainWindow.DataContext = viewModel; InitTrace(); this.RootVisual = mainWindow(); } } }
- Proposé comme réponse Christophe Argento lundi 29 novembre 2010 19:32
- Marqué comme réponse PhilTheGap mardi 30 novembre 2010 07:45
-
-
De rien!
Par contre est-ce que quelqu'un sait si il y a un équivalent en WPF pour ma culture personnelle?
Merci
Christophe Argento
Architecte .Net/Consultant chez Ineat Conseil
Blog: http://christopheargento.com -
Oui regarde ici: http://binary-studio.com/blog/technical-blog/wpf-software-development-model-view-application-drag-and-drop/. Tu verras ce code:
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
private void OnStartup(object sender, StartupEventArgs e)
{
// Create the ViewModel and expose it using the View's DataContext
var view = new MainView();
view.DataContext = new MainViewModel();
view.Show();
}
}
Philippe