2009-12-11 13 views
88

Je travaille sans mélange d'expression et juste en utilisant l'éditeur XAML dans VS2010. La sagesse de ce côté, je vois de plus en plus un besoin de liaison de données au moment du design. Pour les cas simples, la propriété FallbackValue fonctionne très bien (TextBox et TextBlocks, etc.). Mais surtout face à ItemsControl et autres, on a vraiment besoin des données d'échantillon pour être visible dans le concepteur afin que vous puissiez ajuster et modifier les contrôles et les modèles de données sans avoir à exécuter l'exécutable. Je sais que ObjectDataProvider permet de lier un type, et peut donc fournir des données de conception pour la visualisation, mais il y a aussi du jonglage pour permettre aux vraies données d'exécution de se lier sans gaspiller de ressources en chargeant le chargement à la fois l'heure de conception, les données facturées et les liaisons d'exécution. Vraiment ce que je veux, c'est la possibilité d'avoir, disons, "John", "Paul", "George", et "Ringo" apparaître dans le concepteur XAML comme éléments stylables dans mon ItemsControl, mais ont des données réelles apparaît lorsque l'application s'exécute.Quelles approches sont disponibles pour les données de conception fictives dans WPF?

Je sais aussi que Blend permet certains attributs de fantaisie qui définissent la liaison de données temps de conception qui sont effectivement ignorées par WPF dans des conditions d'exécution.

Mes questions sont les suivantes:

1. Comment pourrais-je tirer parti des liaisons à temps la conception des collections et des données non triviales dans le concepteur XAML studio visuel, puis échanger à la durée d'exécution des liaisons en douceur?

2. Comment d'autres personnes ont-elles résolu ce problème de temps de conception par rapport au temps d'exécution? Dans mon cas, je ne peux pas très facilement utiliser les mêmes données pour les deux (comme on pourrait, par exemple, avec une requête de base de données).

3. sont leurs solutions de rechange à un mélange d'expression que je pourrais utiliser pour la conception XAML données intégrée? (je sais qu'il ya des solutions de rechange, mais je veux en particulier quelque chose que je peux utiliser et voir les données liées d'échantillons, etc.?)

Répondre

112

En utilisant VS2010 vous pouvez utiliser Design-Time attributes (fonctionne pour les SL et WPF).J'ai souvent une maquette de données source de toute façon il est donc juste une question de:

  • Ajout de la déclaration d'espace de noms

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    
  • Ajout du contexte de données fictives à la fenêtre/ressources de contrôle

    <UserControl.Resources> 
        <ViewModels:MockXViewModel x:Key="DesignViewModel"/> 
    </UserControl.Resources> 
    
  • Définition du contexte de données de conception

    <Grid d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ... 
    

Fonctionne assez bien.

+1

Oui. Je pense que c'est le gagnant nouveau et clair. L'autre truc était des solutions de contournement, c'est plus "officiellement supporté" – el2iot2

+2

Si vous rencontrez des problèmes en utilisant 'd: DataContext' vous pouvez trouver de l'aide dans cette question: http://stackoverflow.com/questions/8303803/setting-design- time-datacontext-on-a-window-is-giving-a-compiler-error –

+24

Cet exemple ne provoquerait-il pas le chargement d'une instance de MockXViewModel dans vos ressources pour une version release? Est-ce que ce n'est pas une préoccupation? – jpierson

4

Karl Shifflett décrit une approche qui devrait fonctionner aussi bien pour VS2008 et VS2010:

Viewing Design Time Data in Visual Studio 2008 Cider Designer in WPF and Silverlight Projects

Laurent Bugnion a une approche similaire qui se concentre sur expression Blend. Il pourrait travailler pour VS2010, mais je ne l'ai pas encore confirmé.

Simulating data in design mode in Microsoft Expression Blend

+0

merci d'avoir attiré mon attention. J'aime le concept DesignAndRunTimeDataContext. – el2iot2

+1

Karl Shifflett a un article mis à jour pour Visual Studio 2010: [Exemples de données dans le Concepteur WPF et Silverlight] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/sample-data-in -the-wpf-et-silverlight-designer.aspx # consumer) – totorocat

+0

L'essentiel du contenu du lien devrait vraiment être édité dans la réponse, d'autant plus que le premier lien est maintenant mort. – Lauraducky

4

Peut-être que les nouvelles fonctionnalités en temps de conception de Visual Studio 2010 et Expression Blend 4 sont une option pour vous.

Comment ça marche? Est représentée dans l'exemple d'application BookLibrary du WPF Application Framework (WAF). Veuillez télécharger la version .NET4.

+0

Merci pour le lien. Y a-t-il un fichier de code ou une construction que je devrais examiner pour voir l'approche? (un bref aperçu serait génial) – el2iot2

+0

Jetez un coup d'œil au projet BookLibrary.Presentation. Dans ce projet, vous trouverez le dossier "DesignData" qui est utilisé par les UserControls dans le dossier "Views". – jbe

+1

+1. J'ai juste regardé ça.Pour tous ceux qui sont intéressés, le modèle de vue de données exemple est déclaré en XAML et référencé via d: DataContext = "{d: DesignData Source = ../DesignData/SampleLendToViewModel.xaml}" – RichardOD

2

J'utilise cette approche pour générer des données de temps de conception avec .NET 4.5 et Visual Studio 2013.

J'ai juste une ViewModel. Le modèle de vue a une propriété IsInDesignMode qui indique si le mode de conception est actif ou non (voir la classe ViewModelBase). Ensuite, vous pouvez configurer vos données de temps de conception (comme le remplissage d'un contrôle d'éléments) dans le constructeur de modèles de vue. En outre, je ne chargerais pas de données réelles dans le constructeur de modèles de vues, cela pourrait entraîner des problèmes lors de l'exécution, mais la configuration des données pour la conception ne devrait pas poser de problème.

public abstract class ViewModelBase 
{ 
    public bool IsInDesignMode 
    { 
     get 
     { 
      return DesignerProperties.GetIsInDesignMode(new DependencyObject()); 
     } 
    } 
} 

public class ExampleViewModel : ViewModelBase 
{ 
    public ExampleViewModel() 
    { 
     if (IsInDesignMode == true) 
     { 
      LoadDesignTimeData(); 
     } 
    } 

    private void LoadDesignTimeData() 
    { 
     // Load design time data here 
    }  
} 
1

similaires à la réponse les mieux notés, mais mieux à mon avis: Vous pouvez créer une propriété statique pour retourner une instance de données de conception et de référence directement à partir de XAML comme ceci:

<d:UserControl.DataContext> 
    <Binding Source="{x:Static designTimeNamespace:DesignTimeViewModels.MyViewModel}" /> 
</d:UserControl.DataContext> 

Cette évite le besoin d'utiliser UserControl.Resources. Votre propriété statique peut fonctionner comme une fabrique vous permettant de construire des types de données non triviaux - par exemple, si vous n'avez pas de ctor par défaut, vous pouvez appeler ici une fabrique ou un conteneur pour l'injecter dans les dépendances appropriées.

4

Comme un amalgame de la réponse acceptée de Goran et l'excellent commentaire de René.

  • Ajoutez la déclaration d'espace de noms. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  • Référencez votre contexte de données de conception à partir du code.
    <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...

+1

Je suis tenté de marquer cela comme la nouvelle réponse, mais peut-être que nous pouvons tirer dans le reste des détails. – el2iot2

+0

Cela nécessite plus de visibilité ou doit être intégré à la réponse acceptée. C'est une bien meilleure solution. – Lauraducky