2017-01-12 2 views
0

SimpleChildWindows lié au modèle View

Je veux être en mesure de créer un formulaire CRUD dans un popup modal.

Ce formulaire CRUD doit être lié à son propre ViewModel et appelé par une commande dans un autre ViewModel.

Je ne parviens pas à le faire avec SimpleChildWindows ...

Alors ... Est-il possible?

Répondre

0

Ok parfois la solution est sous mon nez, mais je lutte pour le voir ...

Alors, voici ma solution:

<Grid> 
    <Grid > 
     <UserControl Content="{Binding Path=CurrentViewModel}"/> 
    </Grid> 
    <simpleChildWindow:ChildWindow IsOpen="{Binding OpenChildWindows}" 
            Title="{Binding TitleChildWindows}" 
            Content="{Binding CurrentWindowsViewModel }"/> 
</Grid> 

le CurrentWindowsViewModel est binded à un UserControl qui intègre parfaitement dans la propriété Content de mon S impleChildWindows.

Cependant je dois lier toutes les propriétés de ChildWindows au Viewmodel qui "hébergent" mes childwindows ("Title", "IsOpen" etc.).

Tous les ChildWindows ViewModel héritent d'un modèle de classe (qui hérite évidemment de ViewModelBase) avec un titre et peut-être d'autres propriétés spécifiques à ChildWindows.

Je communique par la lumière MVVM Messenger pour dire le « hôte » qui ViewModel pour afficher son nom, puis je lis son « titre » et ouvrez Windows par le « IsOpen » propriétée:

 private void ReceiveMessage(EnumViewModelNames viewName) 
     { 
     var selectedViewModel = ViewModelList.Where(x => x.ViewModelName == viewName).SingleOrDefault(); 
     if (selectedViewModel is TemplateWindowsViewModel) 
     { 
      TitleChildWindows = (selectedViewModel as TemplateWindowsViewModel).Title; 
      OpenChildWindows = true; 
      CurrentWindowsViewModel = (selectedViewModel as TemplateWindowsViewModel); 
     } 
     else if (selectedViewModel != null) 
     { 
      CurrentViewModel = selectedViewModel; 
     } 
     Messenger.Default.Unregister<EnumViewModelNames>(this, (action) => ReceiveMessage(action)); 
     } 

De cette façon, je suis capable d'ouvrir le childWindows à partir du "CurrentViewModel" ou du "MainViewModel".

Cela fonctionne plutôt bien et la vue est simplement un Usercontrol standard lié à un DataContext dans ViewModelLocator. Désolé, Heorhiy Pavlovych, j'ai vu que vous essayiez dur, mais nous avons mal compris ...

+0

Bonjour Speuline, Ce message est ancien, mais pour moi c'est nouveau :), j'ai le même problème, mais je n'arrive pas à le faire fonctionner. Pouvez-vous s'il vous plaît me donner un exemple de votre exemple de travail. Meilleures salutations. Jolynice – jolynice

+0

Bonjour, utilisez-vous la bibliothèque SimpleChildWindows? – Speuline

+0

Bonjour Speuline, Oui j'utilise SimpleChildWindows Library. Je suis novice avec WPF :(, pouvez-vous m'aider s'il vous plait Merci – jolynice

0

Comment je résolu le même problème pour moi-même, en profitant de l'injection de dépendance:

je Unity et la dépendance inscrit à 'Func':


public partial class App 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 
     IUnityContainer container = new UnityContainer(); 
     container.RegisterType<EntityCRUDWindowViewModel>(); 
     container.RegisterType<ConsumerViewModel>(); 
     container.RegisterInstance<Func<Entity, EntityCRUDWindow>>(entity => new EntityCRUDWindow(){DataContext=container.Resolve<EntityCRUDWindowViewModel>(new ParameterOverride("entity", new InjectionParameter<Entity>(entity)))); 
     /* whatever goes here */ 
    } 
} 

ViewModel pour la fenêtre CRUD ressemble


public class EntityCRUDWindowViewModel 
{ 
    private readonly Entity entity; 

    public EntityCRUDWindowViewModel(Entity entity) 
    { 
     this.entity = entity; 
    } 
} 

et vous pouvez obtenir l'instance de la fenêtre EntityCRUDWindow et l'utiliser dans ConsumerViewModel ou tout autre ViewMod el en déclarant simplement dans le paramètre constructeur


public class ConsumerViewModel 
{ 
    public ConsumerViewModel(Func<Entity, EntityCRUDWindow> entityCrudWindowFactory) 
    { 
     this.WhateverCommand = new DelegateCommand(
      () => 
      { 
       Entity someEntity = null; //or whatever 
       entityCrudWindowFactory(someEntity).ShowDialog(); 
      }); 
    } 

    public ICommand WhateverCommand { get; } 
} 

Ainsi, vous pouvez mettre une dépendance dont vous avez besoin dans les paramètres du constructeur des deux viewmodels, tout en gardant à l'esprit que le paramètre Entity entity doit être présent dans EntityCRUDWindowViewModel.

+0

Désolé mais je ne vois pas comment ça va m'aider ... Je veux avoir un dialogue CRUD modal. Votre code me permet de créer un ViewModel CRUD. – Speuline

+0

C'est un moyen de rendre la fenêtre accessible de n'importe où. Mon code ne crée pas viewmodel, il crée la vue (fenêtre dans ce cas) par lui-même –

+0

Je pense que j'ai mal expliqué ce que je voulais, peut-être que mon "edit" m'expliquerait mieux. – Speuline

0

Je probablement ajouter DataTemplate aux ressources et à chaque fois que ce sera rendu vous liez contenu à une instance CrudViewModelType



    <Grid> 
     <Grid.Resources> 
      <DataTemplate DataType="{x:Type whateverNs:MyCrudViewModelType}"> 
       <UserControl Content="{Binding}"/> 
      </DataTemplate> 
     </Grid.Resources> 
     <ContentControl Content={Binding CurrentCrudViewModel}></ContentControl> 
     <simpleChildWindow:ChildWindow IsOpen="{Binding OpenChildWindows}" Content="{Binding MyCrudViewModel}"/> 
    </Grid>