我如何为样式指定设计器数据上下文,以便 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
,我们可以为它提供接口,嵌套类甚至泛型,不会出错:
我经常将 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
,我们可以为它提供接口,嵌套类甚至泛型,不会出错: