Допустимо ли использовать Blend d: Style.DataContext внутри словаря ресурсов WPF? - PullRequest
0 голосов
/ 18 октября 2019

При определении стилей WPF я часто использую тег Expression Blend <d:Style.DataContext>, чтобы сообщить Intellisense, каким будет DataContext во время выполнения. Это прекрасно работает. К сожалению, я не могу сделать эту работу в словаре ресурсов, и мне неясно, почему.

Например, здесь, в стиле для RadTabItem, я говорю Intellisense, что SettingsPageVm будет DataContext:

<UserControl x:Class="Views.ConfigureView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:tk="http://schemas.telerik.com/2008/xaml/presentation"
             xmlns:viewModels="clr-namespace:ViewModels"
             d:DataContext="{d:DesignInstance viewModels:ConfigureVm}">

    <Grid>
        <tk:RadTabControl ItemsSource="{Binding Categories}" >  

            <tk:RadTabControl.Resources>

                <!-- Tell setters that SettingsPageVm will be the datacontext -->
                <Style TargetType="{x:Type tk:RadTabItem}">
                    <d:Style.DataContext>
                        <x:Type Type="viewModels:SettingsPageVm" />
                    </d:Style.DataContext>

                <!-- (Imagine many setters here, binding to SettingsPageVm) -->

Это прекрасно работает.

Но если попытаться переместить этот же стиль в отдельный ResourceDictionary, Visual Studio жалуется. Редактор помещает синий волнистый текст под объявлением d:Style.DataContext и выделяет его красным. Компилятор жалуется на это следующим образом:

1> I: \ Dev \ MyApp \ Resources \ Styles \ DialogStyles.xaml (13,14): ошибка MC4004: стиль не может содержать дочернее «TypeExtension». Дочерний стиль должен быть Сеттером, поскольку он добавляется в коллекцию Сеттеров. Строка 13 Позиция 14.

Почему это допустимо в одном контексте и недопустимо в другом?

<ResourceDictionary 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:viewModels="clr-namespace:ViewModels"
                    xmlns:tk="http://schemas.telerik.com/2008/xaml/presentation"
                    >
    <Style x:Key="SettingsPageTabStyle"  TargetType="{x:Type tk:RadTabItem}">
        <d:Style.DataContext>                           <!-- *** ERROR *** -->
            <x:Type Type="viewModels:SettingsPageVm" />
        </d:Style.DataContext>
    </Style>
</ResourceDictionary>

1 Ответ

0 голосов
/ 18 октября 2019

Отвечая на мой собственный вопрос, потому что через полдня я наткнулся на него.

Я пренебрег добавлением строки

mc:Ignorable="d" 

в свой XAML. Как только я это сделал, все работало нормально.

(Просто один из тех малоизвестных уроков WPF, которые, я уверен, я уже выучил, а затем забыл хотя бы один раз - возможно, дважды - за последние несколько лет работы над WPF.)

...