2013-07-05 15 views
14

Ho appena trascorso diverse ore su un problema quando si utilizza VS2012, WPF 4.5 e dati di progettazione, in particolare l'attributo DesignInstance.DesignInstance che non funziona in VS2012

Obiettivo: volevo avere il supporto dei dati di progettazione nel mio progetto WPF (MVVM-based), sia in VS2012 e si fondono, e non ho potuto per la vita di me rendere l'approccio di lavoro MVVMLight costantemente .

Così ho provato a passare a "solo" utilizzando il supporto integrato per i dati di progettazione, utilizzando l'estensione di markup fornita con Blend.

Problema: Si consideri il seguente codice:

<Window x:Class="Nova.View.AlertsView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:Nova.View" 
     xmlns:vm="clr-namespace:Nova.ViewModel" 
     mc:Ignorable="d" 
     DataContext="{Binding Alerts, Source={StaticResource Locator}}" 
     d:DataContext="{d:DesignInstance vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}" 
... /> 

Sia VS2012 e si fondono le relazioni "il nome DesignAlertsViewModel non esiste nello spazio dei nomi CLR-namespace: Nova.ViewModel", anche se intellisense risolve solo bene, e hai controllato migliaia di volte che lo spazio dei nomi e il nome della classe sono entrambi corretti.

+0

Ho avuto problemi simili in precedenza e penso di dover commentare la riga problematica e compilare l'assembly, quindi funziona correttamente quando lo aggiungi nuovamente. – AlSki

+0

Il mio unico altro suggerimento utilizza la sintassi completa e includo Tipo = ie d: DataContext = "{d: DesignInstance Type = vm: DesignAlertsViewModel, IsDesignTimeCreatable = True}" – AlSki

+0

Grazie, @AlSki, ho _did_ provare la sintassi completa, ma senza fortuna. I dati in fase di progettazione vengono visualizzati inizialmente, ma alla fine smettono di funzionare (scompaiono semplicemente senza errori). Ho aggiornato la mia "soluzione" di seguito per essere una "soluzione alternativa", e farò qualche altra ricerca in questo. – Thomas

risposta

8

Soluzione alternativa: assicurarsi che la classe di dati in fase di progettazione si trovi nello stesso spazio dei nomi della visualizzazione stessa. Una volta spostato il mio DesignAlertsViewModel nello spazio dei nomi View, sia il designer VS2012 che Blend iniziarono immediatamente a lavorare con i dati di progettazione.

Aggiornamento: questo è un rimedio per ora, fino a quando non arrivo alla fine dei problemi. Tuttavia, nel mio caso, questo è l'unico modo per rendere coerenti i dati in fase di progettazione. Naturalmente, se si scende lungo questa rotta si cambiano i nomi delle classi poiché - chiaramente - DesignAlertsViewModel non è più un modello di visualizzazione. Ora è semplicemente un POCO contenente dati in fase di progettazione. Quindi forse AlertsDesignData sarebbe un nome migliore. Non sono eccessivamente felice del fatto che i miei dati in fase di progettazione vivano sotto il mio spazio dei nomi View, ma funziona.

Inoltre, vi invito a dare un'occhiata a Laurent's article from MSDN Magazine, April 2013. Mi piace questo approccio, poiché esercita molto di più lo schema MVVM: il servizio/provider di dati del tempo di progettazione viene iniettato tramite IOC, in modo che i modelli di visualizzazione vengano "esercitati" anche in fase di progettazione.

Aggiornamento 2: Dopo aver trascorso ancora un altro 4 ore su questo, penso che la giuria è ancora fuori su cui approccio è il migliore: Dovremmo andare con semplici classi di dati POCO o l'approccio MVVMLight, utilizzando IOC per design- servizi dati temporali? Il primo è semplice e richiede meno codice, il secondo è più fedele all'approccio MVVM ed esercita i modelli di visualizzazione reali in una certa misura e potrebbe eventualmente rivelare alcuni bug lungo il percorso.

Inoltre, ho dovuto riavviare VS un paio di volte durante il mio refactoring con l'approccio MVVMLight - i dati di progettazione sono semplicemente scomparsi e sono tornati dopo un riavvio VS. Tuttavia, al momento sembra abbastanza stabile e non riesco a individuarlo ulteriormente.

+0

(nessun broker downvote) Questa non è la soluzione. Non devi * farlo *, posso garantirlo. Probabilmente c'è qualcos'altro che sta succedendo. I dati relativi ai tempi di progettazione possono essere molto delicati e non riportano bene gli errori. Suggerirei di riportare la VM nella posizione corretta, pulire la soluzione, riavviare VS e riprovare. Renditi conto che c'è un altro processo che esegue la superficie di progettazione (XDesProc.exe) che è imho buggy. Ha bisogno di fare riferimento al tuo ultimo assemblaggio costruito. Se ha una versione precedente, puoi riscontrare questo problema. – Will

+0

Ok, abbastanza giusto, ho aggiornato la mia risposta per chiarire che per ora dovrebbe essere considerata una soluzione. Tuttavia, continuo a pensare che per alcuni, questo potrebbe essere un approccio completamente raffinato - semplicemente avere POCO con dati in fase di progettazione (sono consapevole che tale POCO non è più un modello di visualizzazione.Vedi il mio commento sulla denominazione). Sono d'accordo sul fatto che il designer sembri buggy - il che rende difficile dare "garanzie" su come far funzionare le cose, IMHO ;-) Se hai esperienza con un approccio migliore che funzioni in modo coerente, ti prego di farmelo sapere! – Thomas

27

Mi sono imbattuto in questo errore me stesso in VS2013 quindi ho trovato questa domanda. Dopo aver cercato di più, ho trovato una risposta che mi ha aiutato a risolverlo.

invece di

d:DataContext="{d:DesignInstance vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}" 

uso

d:DataContext="{d:DesignInstance d:Type=vm:DesignAlertsViewModel, IsDesignTimeCreatable=True}" 

stavo usando" ... d: DesignInstance Type = vm: ..."E che mostra lo stesso errore descritto in precedenza Non appena aggiungo. 'D:'. Tutto funziona

Ecco il filo che ho trovato che ha aiutato

https://stackoverflow.com/a/21690404/2892400

7

Controllare se il." Target piattaforma "nella costruzione di configurazione è impostato su" AnyCPU". il mio è stato impostato su 'x64', in modo che il progettista si lamentava del tipo mancante.

VS è in esecuzione in 32 bit quindi forse c'è un problema con codice in esecuzione da 64 gruppi di bit.

Ho trovato la soluzione quando provavo ad aprire il mio UserControl in "Blend for Visual Studio". Ha mostrato un'eccezione eccellente per me.

P.S .: Dopo aver utilizzato la risposta accettata: utilizzare "d: Type = vm: DesignAlertsViewModel" anziché "vm: DesignAlertsViewModel" il mio controllo era visibile, ma non sono stati visualizzati dati di esempio.

+2

Sì, l'impostazione x86 sta funzionando per me. Molte grazie!. – Juanin

+0

Ho semplicemente aperto il "configuration manager" e lo studio visivo aggiornato ... Funziona ora. – Finickyflame

+0

Questo problema persiste a partire da VS2017 15.5.6.Valuta il problema: https://developercommunity.visualstudio.com/content/problem/63741/the-xaml-designer-cannot-resolve-types-from-the-cu.html – Terrence

0

Ho trovato che DesignInstance non funziona nei miei progetti .NET 3.5 e .NET 4.0, mentre funziona nel progetto> = .NET 4.5 (i progetti sono gli stessi, condividono gli stessi file utilizzando i collegamenti) .

Problemi correlati