L'impostazione del tempo di progettazione DataContext su una finestra genera un errore del compilatore?


203

Ho il seguente XAML di seguito per la finestra principale nella mia applicazione WPF, sto cercando di impostare il tempo di progettazione di d:DataContextseguito, cosa che posso fare con successo per tutti i miei vari UserControls, ma mi dà questo errore quando provo a farlo sul finestra...

Error 1 The property 'DataContext' must be in the default namespace or in the element namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. Line 8 Position 9. C:\dev\bplus\PMT\src\UI\MainWindow.xaml 8 9 UI

<Window x:Class="BenchmarkPlus.PMT.UI.MainWindow"
    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:UI="clr-namespace:BenchmarkPlus.PMT.UI"
    xmlns:Controls="clr-namespace:BenchmarkPlus.PMT.UI.Controls"
    d:DataContext="{d:DesignInstance Type=UI:MainViewModel, IsDesignTimeCreatable=True}"
    Title="MainWindow" Height="1000" Width="1600" Background="#FF7A7C82">

    <Grid>
        <!-- Content Here -->
    </grid>

</Window>

Risposte:


263

Avevo bisogno di aggiungere l' mc:Ignorable="d"attributo al tag Window. In sostanza ho imparato qualcosa di nuovo. Il d:prefisso dello spazio dei nomi riconosciuto da Expression Blend / designer di Visual Studio è in realtà ignorato / "commentato" dal vero compilatore compilatore / xaml!

<Window 
...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
...
/>

Il seguente è stato preso da

Nathan, Adam (2010-06-04). WPF 4 Unleashed (Posizioni Kindle 1799-1811). Sams. Edizione Kindle.

Compatibilità markup

Lo spazio dei nomi XML di compatibilità markup ( http://schemas.openxmlformats.org/markup-compatibility/2006 , in genere utilizzato con un mcprefisso) contiene un attributo Ignorabile che indica ai processori XAML di ignorare tutti gli elementi / attributi negli spazi dei nomi specificati se non possono essere risolto nei loro tipi / membri .NET. (Lo spazio dei nomi ha anche un attributo ProcessContent che ignora Ignorable per tipi specifici all'interno degli spazi dei nomi ignorati.)

Expression Blend sfrutta questa funzionalità per fare cose come aggiungere proprietà in fase di progettazione al contenuto XAML che possono essere ignorate in fase di esecuzione.

mc:Ignorablepuò essere fornito un elenco di spazi dei nomi delimitato da spazi e mc: ProcessContent può ricevere un elenco di elementi delimitati da spazi. Quando XamlXmlReader rileva contenuto ignorabile che non può essere risolto, non segnala alcun nodo per esso. Se il contenuto ignorabile può essere risolto, verrà segnalato normalmente. Pertanto, i consumatori non devono fare nulla di speciale per gestire correttamente la compatibilità del markup.


12
Ho battuto la testa contro questo per un bel po 'di tempo. Ha senso ma sembra una grande svista (gli oggetti dati in fase di progettazione dovrebbero essere supportati senza tutti questi hack)
Basic

3
Se si desidera invece un contesto di dati ignorabile nel proprio nodo come attributo, utilizzare <d: Window.DataContext />
ChéDon

Ottimo consiglio, mi ha aiutato a lottare con una strana eccezione del compilatore. Senza mc: ignorabile, anche se ho impostato d: DataContext, il compilatore XAML lo ha interpretato nel tentativo di impostare DataContext e si è lamentato dell'utilizzo dello spazio dei nomi xmlns errato.
Tore Aurstad,

19

Wow, che dolore! Speriamo che MS metta in supporto VS in fase di progettazione per x: Bind.

Dobbiamo essere in grado di utilizzare il designer VS ma anche passare facilmente a x: Bind anziché a Binding. Ecco cosa ho fatto:

  • Nella mia vista, ho aggiunto una proprietà per ottenere il mio ViewModel. Questo ha senso perché i percorsi x: Bind sono relativi alla Pagina (cioè l'oggetto View).

  • Nella mia pagina XAML, ho aggiunto quanto segue <Page ... >alla parte superiore di XAML:

    mc:Ignorable="d" 
    d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}" 
    DataContext="{x:Bind}"

In questo modo, il contesto dei dati effettivi della Pagina viene impostato sulla Pagina stessa a causa di {x:Bind}. Questo perché x:Bindè relativo alla Pagina e non viene indicato alcun percorso.

Allo stesso tempo, a causa della d:DataContextlinea, il designer VS riflette sulla classe MyView (senza creare un'istanza) ai fini dell'interazione del designer VS. Ciò consente a VS design di MyView, dove è quindi possibile scorrere fino alla proprietà ViewModel, espanderla e selezionare l'elemento a cui si desidera associare.

Quando si esegue tutto ciò, il progettista VS creerà un'istruzione Binding il cui percorso è relativo alla vista, ovvero accade che sia esattamente lo stesso del percorso previsto da x: Bind. Quindi, se vuoi passare a x: Bind in seguito, puoi semplicemente cercare e sostituire tutto " {Binding" con " {x:Bind".

Perché abbiamo persino bisogno della d:DataContextlinea per dire a VS quale classe guardare? Bella domanda, dal momento che si potrebbe pensare che VS possa capire la riga successiva imposta DataContext sulla Pagina, usando DataContext={x:Bind}. Vai avanti e provalo, non funziona e non funziona nemmeno se cambi x: Bind to Binding rispetto a sé.

Speriamo che questa situazione venga ripulita dalla SM !!


3
WPF non supporta x: Bind; questa risposta non funzionerà per OP.
Byrel Mitchell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.