visual tutorial studio descargar wpf

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



wpf vs winforms (2)

Necesitaba agregar el mc:Ignorable="d" a la etiqueta de la ventana. Esencialmente aprendí algo nuevo. El prefijo d: namespace que el diseñador de Expression Blend / Visual Studio reconoce es realmente ignorado / "comentado" por el compilador 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 (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 , normalmente utilizado con un prefijo mc ) contiene un atributo Ignorable que ordena a los procesadores XAML que ignoren todos los elementos / atributos en espacios de nombres especificados si pueden ". t se resuelva 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 hacer cosas como agregar propiedades de tiempo de diseño al contenido XAML que pueden ignorarse en el tiempo de ejecución.

mc:Ignorable puede tener una lista de espacios de nombres delimitada por espacios, y mc: ProcessContent puede tener 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.

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 continuación, que puedo hacer con éxito para todos mis diversos UserControls, pero me da este error cuando trato de hacer en la 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>


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

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

  • En mi página XAML, agregué lo siguiente a la <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 en sí debido a la {x:Bind} . Eso es porque x:Bind es relativo a la página y no hay una 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 haga todo eso, el diseñador de VS creará una declaración de enlace cuya ruta es relativa a la vista, es decir, pasa a ser exactamente la misma que la ruta que x: Bind espera. Entonces, si quiere cambiar a x: Bind 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 a qué clase mirar? Buena pregunta, ya que pensaría que VS podría deducir que la siguiente línea establece 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.

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