Установка времени разработки DataContext в окне дает ошибку компилятора? - PullRequest
193 голосов
/ 29 ноября 2011

У меня есть следующий XAML ниже для главного окна в моем приложении 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>

Ответы [ 2 ]

257 голосов
/ 29 ноября 2011

Мне нужно было добавить атрибут mc:Ignorable="d" в тег Window. По сути, я узнал что-то новое. Префикс d: пространства имен, который признает дизайнер Expression Blend / Visual Studio, фактически игнорируется / "закомментирован" реальным парсером компилятора / xaml!

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

Следующее взято из

Натан, Адам (2010-06-04). WPF 4 Unleashed (Разжигать локации 1799-1811). Sams. Kindle Edition.

Совместимость разметки

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

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

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

17 голосов
/ 10 марта 2016

Ух, какая боль! Будем надеяться, что MS добавит поддержку VS: время разработки для x: Bind.

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

  • В моем представлении я добавил свойство для получения моей модели представления. Это имеет смысл, поскольку пути x: Bind относятся к странице (т. Е. Объекту View).

  • На своей странице 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, путь которого относительно View, то есть он точно совпадает с путем, ожидаемым x: Bind. Итак, если вы хотите позже переключиться на x: Bind, вы можете просто найти и заменить все "{Binding" на "{x:Bind".

Зачем нам даже строка d:DataContext, чтобы указать VS, на какой класс смотреть? Хороший вопрос, поскольку вы могли бы подумать, что VS может выяснить, что следующая строка устанавливает DataContext для страницы, используя DataContext={x:Bind}. Попробуйте, это не работает и не работает, если вы измените x: Bind to Binding относительно себя.

Надеюсь, эта ситуация будет исправлена ​​MS !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...