Spesso leghiamo le proprietà IsExpanded e IsSelected di un oggetto TreeViewItem al mio viewmodel. Ciò consente ad esempio di rendere un oggetto pre-espanso quando l'albero viene caricato o di espandere un oggetto quando viene selezionato.Come posso specificare un datacontext del designer per uno stile, in modo che Resharper trovi le mie proprietà?
Il XAML si presenta così:
<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>
E il mio ViewModel potrebbe essere la seguente:
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"}; }
}
}
Questo funziona bene in esecuzione e designer, ma ReSharper non trova l'itemSelected e ItemExpanded proprietà nei binding e li sottolinea come un avvertimento.
Posso capire perché non li trova (non ho mai specificato "TestViewModel" come tipo Datacontext per lo stile), ma come posso risolvere questo problema? Non esiste una cosa come uno Style-Design-DataContext ...
UPDATE:
Il problema qui è, lo stile è definito nel controllo TreeView e c'è il DataContext è chiaramente impostata su un TestViewModel. Il correttore non ottiene, quello che io stile è un TreeView Elemento e questo articolo ha un DataContext di Test Elemento ViewModel (Tipo di un elemento ItemsSource).
Oh, e ho anche provato a installare lo stile in TreeView.ItemContainerStyle invece se TreeView.Resources (qui dovrebbe essere chiaro il DataContext deve essere un TextItemViewModel), ma che non cambia nulla ...
Usa RelativeSource vincolanti –
non è che solo per la ricerca altri punti di vista? Ho modificato i nomi delle mie proprietà viewmodel per rendere più chiaro il binding al viewmodel. – JCH2k