2015-01-19 12 views
8

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 ...

+0

Usa RelativeSource vincolanti –

+0

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

risposta

10

@ risposta di lhildebrandt è generalmente a destra, ma nel mio caso questa soluzione produce errori che totalmente disabilitano la visualizzazione della vista in designer. Specificare <d:Style.DataContext>all'interno di<Style> tag mi ha aiutato.

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

In questo modo d:DataContext possono essere specificati anche per i controlli, e possiamo fornire interfacce, classi annidate e persino farmaci generici senza errori: https://stackoverflow.com/a/46637478/5598194

+0

Questo finalmente funziona! Niente più errori di progettazione! – JCH2k

+1

Fantastico! Assegnare d: DataContext come proprietà associata (come faccio normalmente per Window/UserControl) ha causato un errore di progettazione, ma ReSharper è riuscito a trovare e verificare le proprietà. Assegnandolo nello stile come fa la tua risposta, rimuove l'errore progettista, e comunque lascia che ReSharper faccia il suo dovere! I Suggest @ JCH2k segna questa risposta come soluzione. –

1

hai provato:

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

Atleast per me le proprietà sono evidenziati e mostrati con IntelliSense in VS 2015 e R # 9.

sembra essere una soluzione identica a Specify datacontext type on listbox ItemContainer in style

+0

Questo non funziona per me. Ottengo l'errore 'Proprietà 'DataContext' non è collegabile agli elementi di tipo 'Style'' –