2011-08-05 10 views
5

Sé que ha habido preguntas con respecto a este error, he encontrado algunos y los he leído, pero para ser honesto, no entendí nada.No se puede encontrar el origen del enlace con la referencia ... problema de ListView de datos enlazados

Tengo una ventana WPF con dos ListViews de datos enlazados. Uno está vinculado a los objetos comerciales (mis clases personalizadas), otro a un Dictionary<string, string>. Todo parece mirar bien en tiempo de ejecución, pero estoy recibiendo errores en la ventana Salida:

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')

y lo mismo para VerticalContentAlignment.

Aunque los ListViews de bost se llenan con elementos como se esperaba, en realidad causa un retraso notable al cargar la ventana.

Buscando una respuesta, encontré este hilo http://social.msdn.microsoft.com/Forums/en/wpf/thread/f3549b2b-5342-41a1-af04-d55e43c48768 - e implementé la solución sugerida, proporcionando los valores predeterminados de HorizontalContentAlignment y VerticalContentAlignment en ambas ListViews. No ayudó.

Aquí está el 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> 
    

El enlace de datos de código:

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

2:

lvDataTypes.ItemsSource = AssignDataType.datatypes; 

donde datatypes es ObservableCollection<Gate>, donde Gate es mi clase de negocios (implementando INotifyPropertyChanged, IComparable y nada especial al respecto).

¿Por qué me sale un error? ¿Por qué está intentando vincular estas propiedades de alineación a cualquier cosa, si configuro sus valores de forma explícita?

+0

¿Por qué establece alguna propiedad del ListView usando un estilo? Eso sería útil como recurso compartido o similar. Declárelos directamente en el elemento ListView. –

+0

No veo el enlace 'RelativeSource' en ninguno de sus XAML. ¿Puedes publicarlo? – Rachel

+0

Eso es lo que busqué, ¡pero simplemente no hay ninguno! El XAML ni siquiera contiene la cadena "relat" (sin distinción entre mayúsculas y minúsculas) –

Respuesta

5

Debe sobrescribir el valor predeterminado ItemContainerStyle. Entonces, la respuesta de Blam es medio correcta. Aquí está el mío:

<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

Supongo que tiene razón (hace tiempo que no trabajo en esa aplicación, así que no puedo verificarlo), pero aún me gustaría entender el POR QUÉ. ¿Por qué uno tiene que anular 'ItemContainerStyle'? ¿Para qué es 'ListViewItem', entonces? –

+0

Cuando incorpora un estilo para ListViewItem, no está anulando todo el estilo predeterminado. Mi suposición es que en algún lugar del estilo predeterminado, hay un enlace RelativeSource para VerticalContentAlignment (ver aquí un ejemplo del estilo predeterminado: http://msdn.microsoft.com/en-us/library/ms788747(v=vs. 110) .aspx). – Charlie

+0

Gracias por la explicación. Caray, yo realmente no calificaría a WPF como amigable con los programadores :) ¡Cómo se supone que alguien debe llegar a la conclusión de que esto es lo que significa el mensaje de error original, sin saber WPF de adentro hacia afuera! Respuesta aceptada –

1

Pruebe a continuación. No estoy seguro de que funcione en su entorno, pero esta es la sintaxis que funciona para mí.

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

Puede ser un problema de enlace de datos. ¿Podrías intentarlo?

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

Usted sabe que ListView.ItemsPanel no está cerrado. Estoy sorprendido de que compila.

+1

Lo mismo, desafortunadamente. –

Cuestiones relacionadas