2011-08-05 58 views
5

我知道有關於這個錯誤的問題,我找到了一些並閱讀它們,但說實話,我不明白一件事。找不到與參考綁定的源... databound ListView問題

我有一個WPF窗口與兩個數據綁定ListViews。一個綁定到業務對象(我的自定義類),另一個綁定到Dictionary<string, string>。一切似乎看上去正常在運行,但我發現在輸出窗口中的錯誤:

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

與同爲VerticalContentAlignment

即使bost ListViews按預期填充項目,但實際上在加載窗口時會導致明顯的延遲。

尋找答案,我發現這個線程http://social.msdn.microsoft.com/Forums/en/wpf/thread/f3549b2b-5342-41a1-af04-d55e43c48768 - 我實現了建議的解決方案,在兩個ListView中提供默認值HorizontalContentAlignmentVerticalContentAlignment。它沒有幫助。

這裏的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> 
    

數據綁定代碼:

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

2:

lvDataTypes.ItemsSource = AssignDataType.datatypes; 

其中datatypesObservableCollection<Gate>,其中Gate是我的商務艙(實施INotifyPropertyChangedIComparable和其他沒有什麼特別的)。

爲什麼我會收到錯誤?爲什麼它試圖將這些對齊屬性綁定到任何東西,如果我明確地設置它們的值?

+0

爲什麼你通過使用樣式設置ListView的某些屬性?這將作爲共享資源或類似的有用。直接在ListView元素上聲明它們。 –

+0

我在任何一個XAML中都看不到'RelativeSource'綁定。你可以發佈嗎? – Rachel

+0

這就是我期待的,但沒有任何! XAML甚至不包含字符串「relat」(不區分大小寫) –

回答

5

您需要覆蓋默認的ItemContainerStyle。所以布萊姆的回答是正確的。這是我的:

<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

我認爲你是對的(已經有一段時間了,我不再在這個應用上工作,所以我無法驗證這一點),但我仍然想知道爲什麼。爲什麼要重寫'ItemContainerStyle'?那麼什麼是ListViewItem呢? –

+0

當您爲ListViewItem內聯樣式時,您不覆蓋整個默認樣式。我的假設是,在默認樣式的某處,有一個用於VerticalContentAlignment的RelativeSource綁定(請參閱此處的默認樣式示例:http://msdn.microsoft.com/en-us/library/ms788747(v=vs)。 110)的.aspx)。 – Charlie

+0

感謝您的解釋。 Geez我不會真的評價WPF的程序員友好:)如何在地球上任何人都應該得出結論,這是什麼原始的錯誤信息意味着,不知道WPF裏面了!接受的答案 –

1

請嘗試以下。不確定它會在你的環境中工作,但這是爲我工作的語法。

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

它可能是一個數據綁定問題。你可以試試嗎?

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

你知道ListView.ItemsPanel沒有關閉。我很驚訝這個編譯。

+1

不幸的是,同樣的事情。 –