¿Establecer el tiempo de diseño DataContext en una ventana está dando un error de compilación?

203

Tengo el siguiente XAML a continuación para la ventana principal en mi aplicación WPF, estoy tratando de configurar el tiempo de diseño a d:DataContextcontinuación, que puedo hacer con éxito para todos mis diversos UserControls, pero me da este error cuando intento hacerlo en el ventana...

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>
Jon Erickson
fuente

Respuestas:

263

Necesitaba agregar el mc:Ignorable="d"atributo a la etiqueta de la ventana. Esencialmente aprendí algo nuevo. ¡El d:prefijo de espacio de nombres que reconoce el diseñador de Expression Blend / Visual Studio es realmente ignorado / "comentado" por el verdadero compilador / analizador xaml!

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

Lo siguiente fue tomado de

Nathan, Adam (2010-06-04). WPF 4 desatado (ubicaciones de Kindle 1799-1811). Sams Versión Kindle.

Compatibilidad de marcado

El espacio de nombres XML de compatibilidad de marcado ( http://schemas.openxmlformats.org/markup-compatibility/2006 , generalmente utilizado con un mcprefijo) contiene un atributo Ignorable que indica a los procesadores XAML que ignoren todos los elementos / atributos en espacios de nombres especificados si no pueden ser resuelto a sus tipos / miembros .NET. (El espacio de nombres también tiene un atributo ProcessContent que anula Ignorable para tipos específicos dentro de los espacios de nombres ignorados).

Expression Blend aprovecha esta característica para hacer cosas como agregar propiedades de tiempo de diseño al contenido XAML que pueden ignorarse en tiempo de ejecución.

mc:Ignorablese le puede dar una lista delimitada por espacios de espacios de nombres, y mc: ProcessContent se le puede dar una lista de elementos delimitados por espacios. Cuando XamlXmlReader encuentra contenido ignorable que no se puede resolver, no informa ningún nodo para él. Si se puede resolver el contenido ignorable, se informará normalmente. Por lo tanto, los consumidores no necesitan hacer nada especial para manejar correctamente la compatibilidad de marcado.

Jon Erickson
fuente
12
He estado golpeándome la cabeza contra esto durante bastante tiempo. Tiene sentido, pero parece una gran supervisión (los objetos de datos en tiempo de diseño deberían ser compatibles sin todos estos hacks)
Básico
3
Si desea un contexto de datos ignorable en su propio nodo como atributo, use <d: Window.DataContext />
ChéDon el
Gran consejo, me ayudó a luchar con una extraña excepción del compilador. Sin mc: ignorable, incluso si configuré d: DataContext, el compilador XAML lo interpretó como un intento de establecer DataContext y se quejó de usar el espacio de nombres xmlns incorrecto.
Tore Aurstad
19

Wow, que dolor! Esperemos que MS ponga algo de soporte de tiempo de diseño VS para x: Bind.

Para poder usar el diseñador VS pero también poder cambiar fácilmente a x: Bind en lugar de Binding. Esto es lo que hice:

  • En mi Vista, agregué una propiedad para obtener mi ViewModel. Esto tiene sentido porque x: las rutas de enlace son relativas a la página (es decir, el objeto Ver).

  • En mi página XAML, agregué lo siguiente <Page ... >en la parte superior de XAML:

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

De esta manera, el contexto de datos real de la página se establece en la página misma debido a {x:Bind}. Esto se debe a que x:Bindes relativo a la página y no hay un camino dado.

Al mismo tiempo, debido a la d:DataContextlínea, el diseñador VS reflexiona sobre la clase MyView (sin crear una instancia) con el propósito de la interacción del diseñador VS. Esto permite el diseño de VS desde MyView, donde puede desplazarse hacia abajo hasta la propiedad ViewModel, expandirlo y seleccionar el elemento al que desea enlazar.

Cuando hace todo eso, el diseñador de VS creará una instrucción Binding cuya ruta es relativa a la Vista, es decir, es exactamente la misma que la ruta que espera x: Bind. Por lo tanto, si desea cambiar a x: Bind más adelante, puede buscar y reemplazar todo " {Binding" con " {x:Bind".

¿Por qué necesitamos la d:DataContextlínea para decirle a VS qué clase mirar? Buena pregunta, ya que pensaría que VS podría descubrir que la siguiente línea establece el DataContext en la página, utilizando DataContext={x:Bind}. Siga adelante y pruébelo, no funciona y tampoco funciona si cambia x: Bind to Binding en relación con uno mismo.

¡Esperemos que esta situación sea limpiada por MS!

sjb -
fuente
3
WPF no es compatible con x: Bind; Esta respuesta no funcionará para OP.
Byrel Mitchell