2013-03-05 10 views
12

W obiekcie ListBox mam właściwość ItemContainer o wartości IsSelected powiązana z moją właściwością ViewModel o wartości IsSelected przy użyciu składni <ListBox.ItemContainerStyle>.Podaj typ datakonteksu w polu listy Element Kontener w stylu

To działa dobrze, ale pojawia się ostrzeżenie Resharper:

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

Jak określić typ określić DataContext na ListBox ItemContainer, aby pozbyć się tego ostrzeżenia?

Oto kod. Mam BarViewModel Klasa:

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

BarViewModel przypisany do DataContext w kontroli zawierającej ListBox

i FooViewModel następująco:

public bool IsSelected 
{ 
    get 
    { 
     return isSelected; 
    } 

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

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

i XAML tak:

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

Aktualizacja Próbowałem ustawienie d:DataContext użyciu setter, jak sugeruje HighCore, ale niestety, to nie pomaga, a nawet łamie build:

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

(Zgłasza: Błąd 1 Tag 'DesignInstance' nie istnieje w przestrzeni nazw XML "schemas.microsoft.com/expression/blend/2008" ;. Linia 31 pozycja 50.)

Aktualizacja 2 Finaly, rozwiązaniem jest ustawienie d:DataContext temat samego elementu stylu (patrz moja odpowiedź ryk):

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

Odpowiedz

15

Jak podkreślił @HighCore rozwiązaniem jest określenie d:DataContext atrybut z mieszanki SDK, jednak działał tylko przy ustawieniu na elemencie Style itsself, a nie w seter nieruchomości :

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

usuwa ostrzeżenie ReSharper i zmienia się również wiązania Path gdy nieruchomość jest renaimed na ViewModel. Chłodny!

+0

+1 Obaj nauczyliśmy się czegoś dzisiaj =) –

+11

Pojawia się następujący błąd: Właściwość "DataContext" nie można dołączyć do elementów typu "Styl". ¿? ¿? ¿ –

+0

@somos, jesteś pewien, że używasz d: DataContext z blend SDK (jest to specjalny dołączony podpór by pozwolić projektantowi wiedzieć o typie VM w czasie projektowania) – Isantipov

2

korzystanie d:DataContext tak :

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

Potrzebujesz również następujących xmlns es dodany do elementu głównego:

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

Interesujące: Ciągle otrzymuję ostrzeżenie o Resharper, a rozwiązanie nie kompiluje się teraz: uruchamiany jest następujący błąd: Błąd Znacznik "DesignInstance" nie istnieje w przestrzeni nazw XML "http://schemas.microsoft. com/expression/blend/2008 ". Linia 31 Pozycja 50. Czy brakuje mi czegoś? – Isantipov

+0

Czy dodałeś 'mc: Ignorable =" d "'? –

+0

Tak, zrobiłem: nie pomaga. Czy kiedykolwiek próbowałeś ustawić d: DataContext w stylu? – Isantipov

2

Określanie d:DataContext="{d:DesignInstance nmspc:Clz}" z innymi atrybutami Style tagu nie pomogło mi: R #/IntelliSense naprawdę zatrzymał podkreślając właściwości byłem wiążących ale także projektant pokazał mi komunikat o błędzie zamiast widoku.

Podstęp, który odkryłem, to określenie <d:Style.DataContext>wewnątrz znacznika Style. Wydawało się, że jest tak uniwersalny, że odpowiada na inne pytanie, dotyczące używania interfejsów jako d:DataContext.

Oto moja odpowiedź na to pytanie z małym przykład: https://stackoverflow.com/a/46637478/5598194

1

Dodawanie do poprzednich odpowiedzi: aby pozbyć się błędu

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

dodać trochę obojętne nazw

xmlns:ignore="designTimeAttribute" 

i użyj go teraz zamiast d: DataContext

<Style TargetType="{x:Type ListBoxItem}" ignore:DataContext="{d:DesignInstance local:FooViewModel }"> 
... 
</Style> 
+0

Nie działa dla mnie. Wciąż dostaję ten sam błąd. –