2011-11-28 8 views
171

Tengo el siguiente XAML a continuación para la ventana principal en mi aplicación WPF, estoy tratando de establecer el tiempo de diseño d:DataContext a continuación, que puedo hacer con éxito para todos mis diversos UserControls, pero me da este error cuando trato de hacer en la ventana ...Configurar el tiempo de diseño ¿DataContext en una ventana está dando un error de compilación?

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> 

Respuesta

230

que necesitaba para añadir el atributo mc:Ignorable="d" a la etiqueta de la ventana. Esencialmente aprendí algo nuevo. El prefijo de espacio de nombres d: que reconoce el diseñador de Expression Blend/Visual Studio es en realidad ignorado/"comentado" por el analizador real/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 Unleashed (Kindle Locations 1799-1811). Sams. Kindle Edition.

Compatibilidad de marcado de

El espacio de nombres de marcas compatibilidad XML (http://schemas.openxmlformats.org/markup-compatibility/2006, normalmente se utiliza con un prefijo mc) contiene un atributo ignorable que instruye Los procesadores XAML ignoran todos los elementos/atributos en espacios de nombres especificados si no se pueden resolver a sus tipos/miembros de .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 función para agregar propiedades de tiempo de diseño al contenido XAML que se pueden ignorar durante el tiempo de ejecución.

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

+11

He estado golpeando mi cabeza contra esto por bastante tiempo. Tiene sentido, pero parece ser un gran descuido (los objetos de datos en tiempo de diseño deben ser compatibles sin todos estos hacks) – Basic

+1

Si desea un contexto de datos ignorable en su propio nodo en su lugar como un atributo use

11

¡Qué dolor! Esperemos que MS ponga algo de soporte VS en tiempo de diseño para x: Bind.

Pudimos usar el diseñador de 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 las rutas x: Bind son relativas a la página (es decir, el objeto View).

  • En mi página XAML, que añade lo siguiente a la <Page ... > en la parte superior de la XAML:

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

De esta manera, el contexto real de los datos de la página se incluye en la página en sí, debido a el {x:Bind}. Eso es porque x:Bind es relativo a la página y no hay ninguna ruta dada.

Al mismo tiempo, debido a la línea d:DataContext, el diseñador de VS refleja en la clase MyView (sin crear una instancia) para la interacción del diseñador de VS.Esto permite que VS diseñe desde MyView, donde puede desplazarse hacia abajo hasta la propiedad ViewModel, expandirla y seleccionar el elemento al que desea enlazarse.

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

¿Por qué incluso necesitamos la línea d:DataContext para decirle a VS qué clase mirar? Buena pregunta, ya que pensaría que VS podría deducir que la siguiente línea configura el DataContext en la Página, usando DataContext={x:Bind}. Adelante, pruébalo, no funciona y tampoco funciona si cambias x: Vincular a Encuadernar en relación con el yo.

Afortunadamente esta situación será limpiada por MS.

Cuestiones relacionadas