我如何为样式指定设计器数据上下文,以便 Resharper 找到我的属性?

How can i specify a designer datacontext for a style, so Resharper finds my properties?

我经常将 TreeViewItem 的 IsExpanded 和 IsSelected 属性绑定到我的视图模型。例如,这使得可以在加载树时预先展开项目或在选择项目时展开项目。

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 类型),但我该如何解决这个问题?没有 Style-Design-Datacontext 这样的东西...

更新:

这里的问题是,样式是在 TreeView 中定义的,而 DataContext 显然设置为 TestViewModel。检查器没有得到,我的风格是 TreeViewItem 并且这个项目有一个 DataContext 的 TestItemViewModel (ItemsSource 的类型元素).

哦,我还尝试在 TreeView.ItemContainerStyle 中设置样式,而不是 TreeView.Resources(这里应该清楚 DataContext 必须是 TextItemViewModel),但这不会改变任何东西。 ..

你试过了吗:

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

至少对我来说,这些属性在 VS 2015 和 R#9 中突出显示并使用 IntelliSense 显示。

似乎与 Specify datacontext type on listbox ItemContainer in style

的解决方案相同

@lhildebrandt 的回答通常是正确的,但在我的情况下,此解决方案会产生错误,完全无法在设计器中显示视图。指定 <d:Style.DataContext> inside <Style> 标签帮助了我。

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

这样也可以为控件指定d:DataContext,我们可以为它提供接口,嵌套类甚至泛型,不会出错: