Встановлення часу проектування DataContext у вікні дає помилку компілятора?


203

У мене нижче основне вікно в моєму додатку WPF, я намагаюся встановити час дизайну d:DataContextнижче, що я можу успішно робити для всіх моїх різних UserControls, але він дає мені цю помилку, коли я намагаюся зробити це на вікно ...

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>

Відповіді:


263

Мені потрібно було додати mc:Ignorable="d"атрибут до тегу Window. По суті я дізнався щось нове. d:Префікс простору імен , що Expression Blend / Візуальний дизайнер Студія визнає фактично ігноруються / «закоментований» реальним компілятором / XAML аналізатор!

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

Наступне було взято з

Натан, Адам (06.06.2010). WPF 4 Unleashed (Kindle Locations 1799-1811). Самс. Kindle видання.

Сумісність розмітки

Простір імен сумісності XML сумісності розмітки ( http://schemas.openxmlformats.org/markup-compatibility/2006 , типово використовується з mcпрефіксом) містить атрибут Ignorable, який дає змогу процесорам XAML ігнорувати всі елементи / атрибути у визначених просторах імен, якщо вони не можуть повинні бути вирішені для їх .NET типів / членів. (У просторі імен також є атрибут ProcessContent, який перекриває Ignorable для конкретних типів всередині ігнорованих просторів імен.)

Expression Blend використовує цю функцію, щоб зробити такі речі, як додати властивості дизайну часу до вмісту XAML, які можна ігнорувати під час виконання.

mc:Ignorableможе бути наданий список просторів імен, обмежений пробілом, і mc: ProcessContent може бути наданий список елементів, обмежених пробілом. Коли XamlXmlReader стикається з ігноруваним вмістом, який неможливо вирішити, він не повідомляє про нього жодних вузлів. Якщо невідомий вміст можна буде вирішити, він повідомлятиметься нормально. Таким чином, споживачам не потрібно робити нічого особливого, щоб правильно керувати сумісністю розмітки.


12
Я бився головою проти цього досить довгий час. Має сенс, але здається, що це надзвичайний нагляд (об'єкти даних для проектування повинні підтримуватися без усіх цих хакерів)
Basic

3
Якщо ви хочете, щоб невідомий контекст даних був у власному вузлі замість атрибута, використовуйте <d: Window.DataContext />
ChéDon,

Чудова порада, допомогла мені прагнути до дивного виключення компілятора. Без mc: невідомий, навіть якщо я встановив d: DataContext, компілятор XAML трактував це як намагається встановити DataContext і скаржився на використання неправильного простору імен xmlns.
Торе Аурстад

19

Нічого собі, який біль! Будемо сподіватися, що MS вкладе в деяку підтримку проекту VS для x: Bind.

Ми можемо використовувати дизайнер VS, але також зможемо легко переключитися на x: Bind, а не Binding. Ось що я зробив:

  • У своєму перегляді я додав властивість отримати свій ViewModel. Це має сенс, оскільки х: Шляхи зв’язування відносно сторінки (тобто об'єкта Перегляд).

  • У своїй сторінці XAML я додав наступне до <Page ... >вершини XAML:

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

Таким чином, фактичний контекст даних Сторінки встановлюється на Саму Сторінку завдяки {x:Bind}. Це тому x:Bind, що відносно Сторінки, і шлях не вказаний.

У той же час, завдяки d:DataContextлінії, дизайнер VS розмірковує над класом MyView (без створення екземпляра) з метою взаємодії дизайнера VS. Це дозволяє VS-дизайну від MyView, де потім можна прокрутити вниз до властивості ViewModel, розгорнути його та вибрати предмет, до якого потрібно прив’язатись.

Коли ви все це зробите, дизайнер VS створить оператор Binding, шлях якого відносно виду, тобто трапляється точно такий же, як і шлях, який очікує x: Bind. Отже, якщо ви хочете перейти на x: Прив’язати згодом, ви можете просто шукати та замінювати всі " {Binding" на " {x:Bind".

Навіщо нам навіть потрібна d:DataContextлінія, щоб сказати VS, який клас подивитися? Добре запитання, оскільки ви можете подумати, що VS може з'ясувати, що вже наступний рядок встановлює DataContext на сторінку, використовуючи DataContext={x:Bind}. Вперед і спробуйте, це не працює, і це не працює, якщо ви зміните х: Прив’язати до Прив'язки відносно себе.

Сподіваємось, ця ситуація буде очищена MS !!


3
WPF не підтримує x: Bind; ця відповідь не працює для ОП.
Барель Мітчелл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.