2009-12-11 9 views
88

Sto lavorando senza l'espressione blend e sto usando l'editor XAML in vs2010. La saggezza di questo a parte, sto vedendo sempre più un'esigenza di associazione dei dati in fase di progettazione. Per casi semplici, la proprietà FallbackValue funziona molto bene (caselle di testo e blocchi di testo, ecc.). Ma soprattutto quando si ha a che fare con ItemsControl e simili, è davvero necessario che i dati di esempio siano visibili nella finestra di progettazione in modo che sia possibile regolare e modificare controlli e modelli di dati senza dover eseguire l'eseguibile.Quali approcci sono disponibili per i dati fittizi in fase di progettazione in WPF?

So che ObjectDataProvider consente l'associazione a un tipo e quindi è in grado di fornire dati di progettazione per la visualizzazione, ma poi c'è qualche giocoleria per consentire ai dati di runtime reali di legare senza sprecare risorse caricando il caricamento sia il tempo di progettazione, i dati dummied e le associazioni di runtime.

In realtà quello che voglio è la possibilità di avere, ad esempio, "John", "Paul", "George" e "Ringo" vengono visualizzati nel designer XAML come elementi stylable nel mio ItemsControl, ma hanno dati reali mostra quando l'applicazione è in esecuzione.

So anche che Blend consente alcuni attributi di fantasia che definiscono i dati di associazione del tempo di progettazione che vengono effettivamente ignorati da WPF in condizioni di runtime.

Quindi le mie domande sono:

1. Come potrei sfruttare attacchi in fase di progettazione delle collezioni e dei dati non banali nel Designer Studio XAML visivo e poi scambiare a runtime attacchi senza problemi?

2. In che modo altri hanno risolto questo problema dei dati di runtime rispetto al tempo di progettazione? Nel mio caso, non posso usare molto facilmente gli stessi dati per entrambi (come si sarebbe in grado, ad esempio, con una query di database).

3. Le loro alternative all'espressione si fondono che potrei utilizzare per il progetto XAML integrato nei dati? (So che ci sono alcune alternative, ma voglio specificamente qualcosa che posso usare per vedere i dati di esempio legati, ecc?)

risposta

112

Utilizzando VS2010 è possibile utilizzare Design-Time attributes (funziona sia per SL che per WPF).Di solito ho un modello di dati source in ogni caso quindi è solo una questione di:

  • L'aggiunta della dichiarazione dello spazio dei nomi

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    
  • Aggiungendo il contesto dati finto di finestra/risorse di controllo

    <UserControl.Resources> 
        <ViewModels:MockXViewModel x:Key="DesignViewModel"/> 
    </UserControl.Resources> 
    
  • Impostazione contesto dati in fase di progettazione

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

Funziona abbastanza bene.

+1

Sì. Penso che questo sia il nuovo e chiaro vincitore. L'altra roba era workaround, questa è più "ufficialmente supportata" – el2iot2

+2

Se hai problemi con l'uso di 'd: DataContext' potresti trovare qualche aiuto in questa domanda: http://stackoverflow.com/questions/8303803/setting-design- time-datacontext-on-a-finestra-is-giving-a-compiler-error –

+24

Questo esempio non ha causato il caricamento di un'istanza di MockXViewModel nelle risorse per una release build? Non è una preoccupazione? – jpierson

4

Karl Shifflett descrive un approccio che dovrebbe funzionare altrettanto bene per VS2008 e VS2010:

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

Laurent Bugnion ha un approccio simile che si concentra su Expression Blend. È potrebbe funzionare per VS2010, ma non ho ancora confermato questo.

Simulating data in design mode in Microsoft Expression Blend

+0

grazie per aver portato questo alla mia attenzione. Mi piace il concetto DesignAndRunTimeDataContext. – el2iot2

+1

Karl Shifflett ha un articolo aggiornato per Visual Studio 2010: [Dati di esempio in WPF e Silverlight Designer] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/sample-data-in -the-wpf-and-silverlight-designer.aspx # che consuma) – totorocat

+0

L'essenza del contenuto del link dovrebbe essere effettivamente modificata nella risposta, specialmente dal momento che il primo link è morto. – Lauraducky

4

Forse le nuove funzionalità in fase di progettazione di Visual Studio 2010 e Expression Blend 4 sono un'opzione per voi.

Come funziona è mostrato nella BookLibrary applicazione campione della WPF Application Framework (WAF). Si prega di scaricare la versione .NET4.

+0

Grazie per il link. C'è un particolare file di codice o un costrutto che dovrei guardare per vedere l'approccio? (una breve panoramica sarebbe ottima) – el2iot2

+0

Dai un'occhiata al progetto BookLibrary.Presentation. In questo progetto trovi la cartella "DesignData" che viene utilizzata dagli UserControls nella cartella "Visualizzazioni". – jbe

+1

+1. Ho appena dato un'occhiata a questo.Per chiunque sia interessato il modello di visualizzazione dati di esempio è dichiarato in XAML e referenziato tramite d: DataContext = "{d: DesignData Source = ../DesignData/SampleLendToViewModel.xaml}" – RichardOD

2

Io uso questo metodo per la generazione di dati di tempo di progettazione con .NET 4.5 e Visual Studio 2013.

Ho solo un ViewModel. Il modello di vista ha una proprietà IsInDesignMode che indica se la modalità di progettazione è attiva o meno (vedere la classe ViewModelBase). Quindi è possibile impostare i dati del tempo di progettazione (come il riempimento di un controllo di elementi) nel costruttore di viste.

Inoltre, non vorrei caricare i dati reali nel costruttore di modelli di vista, questo potrebbe causare problemi in fase di esecuzione, ma l'impostazione dei dati per la progettazione non dovrebbe essere un problema.

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

Simile al top rated risposta, ma meglio a mio parere: È possibile creare una proprietà statica per restituire un'istanza di dati di progettazione e di fare riferimento direttamente da XAML in questo modo:

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

Questo evita la necessità di utilizzare UserControl.Resources. La proprietà statica può funzionare come una fabbrica che consente di creare tipi di dati non banali, ad esempio se non si dispone di un ctor predefinito, è possibile chiamare una fabbrica o un contenitore qui per iniettare in appropriate dipendenze.

4

Come amalgama della risposta accettata di Goran e dell'eccellente commento di Rene.

  • Aggiungere la dichiarazione dello spazio dei nomi. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  • Riferimento del contesto di dati di tempo di progettazione dal codice.
    <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...

+1

Sono tentato di contrassegnarlo come la nuova risposta, ma forse possiamo inserire il resto dei dettagli. – el2iot2

+0

Ciò richiede maggiore visibilità o deve essere inserito nella risposta accettata. È una soluzione molto migliore. – Lauraducky