Как я могу указать дизайнерский текст данных для стиля, чтобы Resharper нашел мои свойства?

Я часто связываю свойства IsExpanded и IsSelected объекта TreeViewItem с моей моделью представления. Это, например, позволяет сделать элемент предварительно развернутым при загрузке дерева или развернуть элемент при его выделении.

XAML выглядит так:

<Window x:Class="StyleSetterDatatypeTest.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:test="clr-namespace:StyleSetterDatatypeTest"
            Title="MainWindow" Height="350" Width="525"
            mc:Ignorable="d"
            d:DataContext="{d:DesignInstance test:TestViewModel, IsDesignTimeCreatable=True}">

    <TreeView ItemsSource="{Binding Items}">
        <TreeView.Resources>
            <Style TargetType="TreeViewItem">
                <Setter Property="IsExpanded" Value="{Binding ItemExpanded}"/>
                <Setter Property="IsSelected" Value="{Binding ItemSelected}"/>
            </Style>

            <HierarchicalDataTemplate DataType="{x:Type test:TestItemViewModel}" ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Name}"/>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>
</Window>

И моя модель может выглядеть так:

public class TestItemViewModel
{
    public bool ItemExpanded { get; set; }

    public bool ItemSelected { get; set; }

    public string Name { get; set; }

    public string[] Children
    {
        get { return new [] {"Child 1", "Child 2"}; }
    }
}

Это прекрасно работает в исполнении и дизайнере, но Resharper не находит свойства ItemSelected и ItemExpanded в привязках и подчеркивает их как предупреждение.
Я могу понять, почему он не находит их (я никогда не определял "TestViewModel" в качестве типа Datacontext для стиля), но как я могу это исправить? Нет такой вещи как Стиль-Дизайн-Datacontext...

ОБНОВИТЬ:

Проблема здесь в том, что стиль определен в TreeView, и там DataContext явно установлен в TestViewModel. Средство проверки не получает, что то, что я стилизую, является Элементом TreeView, и у этого элемента есть DataContext Test Item ViewModel (Тип элемента ItemsSource).

О, и я также попытался вместо этого установить стиль в TreeView.ItemContainerStyle, если TreeView.Resources (здесь должно быть ясно, что DataContext должен быть TextItemViewModel), но это ничего не меняет...

2 ответа

Решение

Ответ @lhildebrandt, как правило, правильный, но в моем случае это решение выдает ошибки, которые полностью отключают отображение представления в конструкторе. Определение <d:Style.DataContext> внутри <Style> тег помог мне.

<Style>
    <d:Style.DataContext>
        <x:Type Type="local:MyTreeItem" />
    </d:Style.DataContext>
    <!--usual setters, triggers, etc.-->
</Style>

В этом случае d:DataContext также может быть указан для элементов управления, и мы можем предоставить ему интерфейсы, вложенные классы и даже обобщенные элементы без каких-либо ошибок: /questions/10766985/ddesigninstance-s-tipom-interfejsa/10766998#10766998

Ты пытался:

    <Style TargetType="TreeViewItem" d:DataContext="{d:DesignInstance     
 test:TestItemViewModel}">

По крайней мере, для меня свойства выделены и показаны с IntelliSense в VS 2015 и R#9.

Кажется, что это идентичное решение для указания типа datacontext в списке ItemContainer в стиле

Другие вопросы по тегам