2017-01-31 5 views
0

Je me demandais si je pouvais avoir un modèle de fenêtre enfant dans la section de ressources de la fenêtre principale et si ses propriétés étaient liées au modèle principal. Je simple propriété de chaîne sur le premier modèle et chaîne DependencyProperty sur le deuxième et a essayé de lier cette façon:Liaison de la propriété de ressource à la propriété DataContext

<Window.DataContext> 
    <local:MainWindowModel x:Name="MainWindowModel"/> 
</Window.DataContext> 
<Window.Resources> 
    <local:SecondWindowModel x:Key="SecondWindowModel" SecondString="{Binding FirstString}"/> 
</Window.Resources> 

SecondWindowModel est un DependencyObject et SecondString est un DependencyProperty comme WPF exige. Mais SecondString est toujours nul, son setter n'est jamais appelé. Pourquoi?

Répondre

1

Je suppose que WPF instanciera correctement le modèle de vue MainWindowModel en tant que DataContext de Windows.
Mais votre modèle de vue SecondWindowModel étant une ressource, est en fait une ressource statique.
Et en C#, une classe statique n'est initialisée que lorsque vous l'utilisez pour la première fois. Je ne suis pas sûr si WPF initialise ses ressources statiques lors de la déclaration.
Vous pouvez ajouter un constructeur statique à SecondWindowModel avec un point d'arrêt et vérifier s'il est réellement initialisé avant MainWindowViewModel ou pas du tout.

+0

Votre estimation est exacte, mais peut-il y avoir une solution de contournement? –

+0

Une façon (très!) Maladroite de le faire serait d'ajouter SecondWindowModel comme datacontext d'un contrôle, donnez ax: Name (comme x: Name = "localContext") à votre fenêtre et liez SecondString (comme "{Binding ElementName = localContext Path = DataContext.FirstString} "). Mais honnêtement, je ne pense pas que le viewmodel d'un WPF est destiné à être utilisé de cette façon. – Seb