2013-03-05 20 views
12

In un ListBox Ho proprietà di un ItemContainer IsSelected legato alla proprietà di mio ViewModel IsSelected utilizzando <ListBox.ItemContainerStyle> sintassi.Specificare DataContext tipo sulla casella di riepilogo ItemContainer in stile

Funziona benissimo, ma ottengo un avvertimento ReSharper:

Cannot resolve property 'IsSelected' in data context of type "FooSolution.BarViewModel".

Come faccio a specificare specificare DataContext tipo sulla ListBox ItemContainer per sbarazzarsi di questo avviso?

Ecco il codice. Ho una classe BarViewModel:

public ObservableCollection<FooViewModel> FooItems { get;set; } 

BarViewModel è assegnato al DataContext nel controllo che contiene il ListBox

e FooViewModel come segue:

public bool IsSelected 
{ 
    get 
    { 
     return isSelected; 
    } 

    set 
    { 
     if (isSelected == value) 
     { 
      return; 
     } 

     isSelected = value; 
     RaisePropertyChanged(() => IsSelected); 
    } 
} 

e XAML come questo:

<ListBox ItemsSource="{Binding FooItems}" SelectionMode="Multiple">   
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Aggiornamento Ho provato a installare d:DataContext usando un setter, come suggerito da HighCore, ma sfortunatamente, non aiuta e anche rompe la compilazione:

<Setter Property="d:DataContext" Value="{d:DesignInstance yourxmlns:yourItemViewModelClass}"/> 

(Produce: Errore 1 Il tag 'DesignInstance' non esiste nello spazio dei nomi XML 'schemas.microsoft.com/expression/blend/2008' ;. Linea 31 posizione 50.)

Update 2 Finaly, la soluzione è quella di impostare d:DataContext sull'elemento stile stesso (vedi la mia risposta sotto):

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance local:FooViewModel }"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
    </Style> 

risposta

15

Come rilevato dalla @HighCore la soluzione è specificare d:DataContext attributo dalla miscela SDK, tuttavia, funzionava solo quando è impostato su un elemento di stile itsself, non nel setter struttura :

<ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance local:FooViewModel }"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
     </Style> 
</ListBox.ItemContainerStyle> 

Ciò elimina gli avvisi di ReSharper e cambia anche il percorso vincolante quando la proprietà è renaimed sul ViewModel. Freddo!

+0

+1 entrambi abbiamo imparato qualcosa oggi =) –

+11

Viene visualizzato il seguente errore: Proprietà 'DataContext' non è collegabile agli elementi di tipo 'Stile'. ¿? ¿? ¿ –

+0

@somos, sei sicuro, stai usando d: DataContext da blend SDK (questo è un puntello speciale per consentire al progettista di conoscere il tipo di VM in fase di progettazione) – Isantipov

2

uso d:DataContext come questo :

<Setter Property="d:DataContext" Value="{d:DesignInstance yourxmlns:yourItemViewModelClass}"/> 

È inoltre necessario il seguente xmlns es aggiunti all'elemento radice:

 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
+2

È interessante notare che continuo a ricevere l'avviso Resharper e la soluzione non viene compilata ora: viene generato il seguente errore: Errore Il tag "DesignInstance" non esiste nello spazio dei nomi XML "http://schemas.microsoft. com/espressione/miscela/2008' . Linea 31 Posizione 50. Mi manca qualcosa? – Isantipov

+0

Hai aggiunto 'mc: Ignorable =" d "'? –

+0

Sì, l'ho fatto: non aiuta. Hai mai provato a impostare d: DataContext in uno stile? – Isantipov

2

Specificando d:DataContext="{d:DesignInstance nmspc:Clz}" con altri attributi del tag Stylenon mi ha aiutato: R #/IntelliSense davvero fermato mettendo in evidenza le proprietà sono stato il legame con ma il progettista mi ha anche mostrato un messaggio di errore al posto della vista.

Il trucco che ho scoperto è specificare <d:Style.DataContext>all'interno del tag il tag Style. E sembrava così universale da rispondere ad un'altra domanda, sull'uso delle interfacce come d:DataContext.

Qui è la mia risposta a questa domanda con un piccolo esempio: https://stackoverflow.com/a/46637478/5598194

1

aggiunta alle risposte precedenti: per sbarazzarsi di errore

Property 'DataContext' is not attachable to elements of type 'Style'

aggiungere un po 'namespace fittizio

xmlns:ignore="designTimeAttribute" 

e usalo ora invece di d: DataContext

+0

Non funziona per me. Ho ancora lo stesso errore. –

Problemi correlati