Как я могу определить конструктор datacontext для стиля, поэтому 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>
И моя viewmodel может выглядеть так:
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 в Bindings и подчеркивает их как предупреждение.
Я могу понять, почему он их не находит (я никогда не указывал "TestViewModel" как тип Datacontext для стиля), но как я могу это исправить? Нет такой вещи, как Style-Design-Datacontext...
ОБНОВИТЬ:
Проблема здесь в том, что стиль определен в TreeView, и там DataContext явно установлен в TestViewModel. Проверки не получить, что то, что я стиль является TreeView товара и этот элемент имеет DataContext из теста Пункт ViewModel (тип элемента ItemsSource).
О, и я также попытался установить стиль в TreeView.ItemContainerStyle вместо этого, если TreeView.Resources (здесь должно быть ясно, что DataContext должен быть TextItemViewModel), но это ничего не меняет...
Ответы
Ответ 1
Ответ @lhildebrandt в целом прав, но в моем случае это решение создает ошибки, которые полностью отключают отображение представления в дизайнере. Указание <d:Style.DataContext>
внутри <Style>
помогло мне.
<Style>
<d:Style.DataContext>
<x:Type Type="local:MyTreeItem" />
</d:Style.DataContext>
<!--usual setters, triggers, etc.-->
</Style>
Таким образом, d:DataContext
также может быть указан для элементов управления, и мы можем предоставить ему интерфейсы, вложенные классы и даже дженерики без каких-либо ошибок: fooobar.com/questions/262214/...
Ответ 2
Ты пробовал:
<Style TargetType="TreeViewItem" d:DataContext="{d:DesignInstance
test:TestItemViewModel}">
По крайней мере, для меня свойства выделены и показаны с помощью IntelliSense в VS 2015 и R # 9.
Кажется, это идентичное решение для указания типа datacontext в listbox ItemContainer в стиле