2011-08-05 6 views
5

Wiem, że były pytania dotyczące tego błędu, znalazłem je i czytałem, ale szczerze mówiąc, nic nie rozumiałem.Nie mogę znaleźć źródła do powiązania z odniesieniem ... databound Problem z listView

Mam okno WPF z dwoma listViewami databound. Jeden jest powiązany z obiektami biznesowymi (moje klasy niestandardowe), inny z Dictionary<string, string>. Wszystko wydaje się wyglądać dobrze w czasie wykonywania, ale ja dostaję błędy w oknie Output:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ListViewItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')

i taka sama dla VerticalContentAlignment.

Mimo że listy listew bost zapełniane są przedmiotami zgodnie z oczekiwaniami, w rzeczywistości powoduje zauważalne opóźnienie podczas ładowania okna.

Poszukując odpowiedzi, znalazłem ten wątek http://social.msdn.microsoft.com/Forums/en/wpf/thread/f3549b2b-5342-41a1-af04-d55e43c48768 - i zaimplementowałem sugerowane rozwiązanie, dostarczając wartości domyślne zarówno HorizontalContentAlignment i VerticalContentAlignment w obu ListViews. To nie pomogło.

Oto XAML:

  • ListView 1:

       <ListView Margin="15,50,15,15" Name="lvLanguageCodes" FontSize="13" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
            <ListView.Resources> 
             <Style TargetType="ListViewItem"> 
              <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
              <Setter Property="VerticalContentAlignment" Value="Stretch" /> 
             </Style> 
            </ListView.Resources> 
            <ListView.ItemsPanel> 
             <ItemsPanelTemplate> 
              <UniformGrid Columns="3" /> 
             </ItemsPanelTemplate> 
            </ListView> 
    
  • ListView 2

         <ListView.Resources> 
              <Style TargetType="ListViewItem"> 
               <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
               <Setter Property="VerticalContentAlignment" Value="Stretch" /> 
               <EventSetter Event="Selected" Handler="lvItemSelected" /> 
              </Style> 
              <Style x:Key="GrayOutMappedColumn" TargetType="{x:Type TextBlock}"> 
               <Style.Triggers> 
                <DataTrigger Binding="{Binding Mapped}" Value="False"> 
                 <Setter Property="TextElement.Foreground" Value="Black" /> 
                </DataTrigger> 
               </Style.Triggers> 
               <Setter Property="TextElement.Foreground" Value="DarkGray" /> 
              </Style> 
             </ListView.Resources> 
             <ListView.GroupStyle> 
              <GroupStyle> 
               <GroupStyle.HeaderTemplate> 
                <DataTemplate> 
                 <Border BorderBrush="LightGray" BorderThickness="0,0,0,1"> 
                  <TextBlock FontSize="12" FontWeight="Bold" Margin="0,10" Text="{Binding Name}" /> 
                 </Border> 
                </DataTemplate> 
               </GroupStyle.HeaderTemplate> 
              </GroupStyle> 
             </ListView.GroupStyle> 
             <ListView.ItemsPanel> 
              <ItemsPanelTemplate> 
               <UniformGrid Columns="4" /> 
              </ItemsPanelTemplate> 
             </ListView.ItemsPanel> 
             <ListView.ItemTemplate> 
              <DataTemplate> 
               <StackPanel ClipToBounds="False" HorizontalAlignment="Stretch" Width="Auto"> 
                <TextBlock HorizontalAlignment="Stretch" Style="{StaticResource GrayOutMappedColumn}" Text="{Binding Path=FriendlyName}" Width="Auto" /> 
               </StackPanel> 
              </DataTemplate> 
             </ListView.ItemTemplate> 
    

wiązania danych kod:

lvLanguageCodes.ItemsSource = languages; 
lvLanguageCodes.SelectedValuePath = "Key"; 
lvLanguageCodes.DisplayMemberPath = "Value"; 

2:

lvDataTypes.ItemsSource = AssignDataType.datatypes; 

gdzie datatypes jest ObservableCollection<Gate>, gdzie Gate jest moją klasą biznesową (wdrażającą INotifyPropertyChanged, IComparable i nie jest w tym nic specjalnego).

Dlaczego pojawia się błąd? Dlaczego próbuje powiązać te właściwości dopasowania z czymkolwiek, jeśli ustawię ich wartości jawnie?

+0

Dlaczego ustawić niektóre właściwości ListView za pomocą stylu? Byłoby użyteczne jako zasoby wspólne lub podobne. Deklaruj je bezpośrednio w elemencie ListView. –

+0

Nie widzę powiązania 'RelativeSource' w żadnym z XAML. Czy możesz to opublikować? – Rachel

+0

Tego właśnie szukałem, ale po prostu nie ma! XAML nie zawiera nawet ciągu "relat" (wielkość liter nie ma znaczenia) –

Odpowiedz

5

Musisz zastąpić domyślną ItemContainerStyle. Więc odpowiedź Blama jest w połowie poprawna. Oto mój:

<Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem"> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
    <Setter Property="OverridesDefaultStyle" Value="True"/> 
    <Setter Property="SnapsToDevicePixels" Value="True"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
    ... 
</Style> 

<ListBox ItemContainerStyle="{StaticResource ListBoxItemStyle}" 
+0

Rozumiem, że masz rację (minęło trochę czasu i nie pracuję już nad tą aplikacją, więc nie mogę tego zweryfikować), ale nadal chciałbym zrozumieć DLACZEGO. Dlaczego trzeba zastąpić 'ItemContainerStyle'? Do czego służy "ListViewItem"? –

+0

Po wstawieniu stylu dla obiektu ListViewItem nie zastępujesz całego domyślnego stylu. Moje założenie jest takie, że gdzieś w domyślnym stylu istnieje powiązanie RelativeSource dla VerticalContentAlignment (zobacz tutaj przykład domyślnego stylu: http://msdn.microsoft.com/en-us/library/ms788747(v=vs. 110) .aspx). – Charlie

+0

Dzięki za wyjaśnienie. Geez Naprawdę nie oceniłbym WPF jako przyjaznego programisty :) Jak na Ziemi każdy powinien dojść do wniosku, że to, co oznacza oryginalny komunikat o błędzie, bez znajomości WPF na wylot! Odpowiedź przyjęta –

1

Spróbuj poniżej. Nie jestem pewny, czy zadziała w twoim środowisku, ale to jest składnia, która działa dla mnie.

<ListView.Resources> 
      <Style TargetType="{x:Type ListViewItem}"> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
       <Setter Property="VerticalContentAlignment" Value="Stretch" /> 
      </Style> 

To może być problem wiążący dane. Czy możesz spróbować?

<ListView Margin="15,50,15,15" Name="lvLanguageCodes" FontSize="1" 
       PresentationTraceSources.TraceLevel="High" 
       DisplayMemberPath="Value" SelectedValuePath="Key" ItemsSource="Langages"> 
     <ListView.Resources> 
      <Style TargetType="ListViewItem"> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
       <Setter Property="VerticalContentAlignment" Value="Stretch" /> 
      </Style> 
     </ListView.Resources> 
    </ListView> 

Wiesz ListView.ItemsPanel nie jest zamknięty. Jestem zaskoczony, że to się kompiluje.

+1

To samo niestety. –