c# - studio - ¿Cómo puedo especificar un contexto de datos de diseñador para un estilo, por lo que Resharper encuentra mis propiedades?
resharper visual studio code (2)
A menudo ato las propiedades IsExpanded e IsSelected de TreeViewItem a mi viewmodel. Esto, por ejemplo, hace posible que un elemento se expanda previamente cuando se carga el árbol o expande un elemento cuando se selecciona.
El XAML se ve así:
<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>
Y mi modelo de vista podría verse así:
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"}; }
}
}
Esto funciona bien en la ejecución y el diseñador, pero Resharper no encuentra las propiedades ItemSelected y ItemExpanded en los enlaces y los subraya como una advertencia.
Puedo entender por qué no los encuentra (nunca especifiqué "TestViewModel" como el tipo de contexto de datos para el Estilo), pero ¿cómo puedo solucionarlo? No existe el estilo Style-Design-Datacontext ...
ACTUALIZAR:
El problema aquí es que el estilo está definido en TreeView y allí el DataContext está claramente establecido en un TestViewModel. El comprobador no obtiene, lo que yo estilo es un elemento TreeView y este elemento tiene un DataContext de Test Item Item ViewModel (tipo de un elemento ItemsSource).
Ah, y también intenté establecer el estilo en TreeView.ItemContainerStyle en lugar de TreeView.Resources (aquí debe quedar claro que DataContext tiene que ser un TextItemViewModel), pero eso no cambia nada ...
Has probado:
<Style TargetType="TreeViewItem" d:DataContext="{d:DesignInstance
test:TestItemViewModel}">
Al menos para mí, las propiedades se destacan y se muestran con IntelliSense en VS 2015 y R # 9.
Parece ser una solución idéntica a Specify datacontext type en listbox ItemContainer en estilo
La respuesta de @ lhildebrandt es generalmente correcta, pero en mi caso esta solución produce errores que deshabilitan totalmente la visualización en el diseñador. Especificar <d:Style.DataContext>
dentro de la etiqueta <Style>
me ayudó.
<Style>
<d:Style.DataContext>
<x:Type Type="local:MyTreeItem" />
</d:Style.DataContext>
<!--usual setters, triggers, etc.-->
</Style>
De esta forma d:DataContext
también se puede especificar para controles, y podemos proporcionarle interfaces, clases anidadas e incluso genéricos sin ningún error: https://.com/a/46637478/5598194