Question

J'utilise l'architecture MVVM pour découpler mon application. Autrement dit, vous voyez souvent quelque chose comme

var u = new UserControl();
u.Content = new MyCustomType(); // MyCustomType is not a control

L'interface utilisateur est définie via des modèles de données résidant dans des dictionnaires de ressources dans leurs propres fichiers XAML

<ResourceDictionary ...>
    <DataTemplate DataType="{x:Type local:MyCustomType}">
        ...

Je charge les ressources au démarrage de l'application et celle-ci est heureuse d'afficher mon interface utilisateur. Mais si je supprime un modèle de données et en ajoute un nouveau (même clé, même type de données), l'interface utilisateur utilise toujours l'ancien modèle de données. Bien sûr, je peux redéfinir le contenu de mon conteneur pour forcer une actualisation, mais cela semble maladroit, car je dois avertir chaque contrôle de tout changement, comme ceci

var tmp = control.Content;
control.Content = null;
control.Content = tmp; // New data template will be used

D'autres approches?

Était-ce utile?

La solution

Cela est dû au fait que les ressources sont statiques dans votre dictionnaire. Une fois qu'ils ont été utilisés, ils ne seront pas mis à jour. Vous pouvez essayer de recharger les dictionnaires, mais cela ne fera que mettre à jour de nouveaux contrôles, pas les anciens.

Si vous souhaitez prendre en charge plusieurs DataTemplates, vous pouvez envisager la classe DataTemplateSelector, qui sélectionnera un modèle en fonction de vos conditions: http://msdn.microsoft.com/fr us / library / system.windows.controls.datatemplateselector.aspx

Si vous devez changer de modèle "à la volée", vous pouvez toujours envisager d'utiliser ControlTemplates et une propriété Binding for Template de votre contrôle ...

{Binding Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}

HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top