2011-06-21 77 views
0

我有一個UserControl,它包含綁定到一個名爲Data的CollectionViewSource的ListBox,並且該集合中的每個項目都使用ItemTemplate顯示在ListBox中。該ItemTemplate是一個ItemsControl,它綁定到另一個名爲Rows的CollectionViewSource。行存儲一個或多個MyListBoxRow對象。對於Data CollectionViewSource中的每個對象,我得到一個ListBoxItem,它由來自行CollectionViewSource的ContentPresenters組成。WPF DataTemplate Binding與ListBox中嵌套的ItemsControl一起使用時不起作用

我這樣做的原因是我可以在運行時操作Rows集合並添加/刪除「行」的信息。

我遇到的問題是「NumberDescriptionDataTemplate」,「NotesDataTemplate」和「AuditDataTemplate」DataTemplates中的數據綁定。例如,NotesDataTemplate中的{Binding Notes}不起作用,因爲當前綁定的項目來自行而不是數據。如果我將NotesDataTemplate更改爲{Binding Description},則按預期方式從MyListBoxRow對象獲取Description。

如何修改我的DataTemplates中的綁定語句,以便將信息綁定到數據集合中的項目而不是來自行集合中的項目?

MyListBox.xaml ...

<UserControl x:Name="MyListBox"...> 
<UserControl.Resources> 
    <CollectionViewSource x:Key="Data" Source="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
    <CollectionViewSource x:Key="Rows" Source="{Binding ListRows, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Filter="Rows_Filter" /> 
</UserControl.Resources> 

<ListBox ItemsSource="{Binding Source={StaticResource Data}}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ItemsControl ItemsSource="{Binding Source={StaticResource Rows}}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <ContentPresenter ContentTemplate="{Binding RowTemplate}"/> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
</UserControl> 

「MyListBox」 使用...

<Window...> 
<Window.Resources> 
    <DataTemplate x:Key="NumberDescriptionDataTemplate"> 
     <TextBlock Text="{Binding Number_Description}" FontSize="20" /> 
    </DataTemplate> 
    <DataTemplate x:Key="NotesDataTemplate"> 
     <TextBlock Text="{Binding Description}" /> 
    </DataTemplate> 
    <DataTemplate x:Key="AuditDataTemplate"> 
     <TextBlock FontSize="8pt" FontStyle="Italic" TextTrimming="CharacterEllipsis"> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{}Added On {0:ddd MMM dd, yyyy hh:mm:ss}; Last Modified On {1:ddd MMM dd, yyyy hh:mm:ss}; Removed On {2:ddd MMM dd, yyyy hh:mm:ss}"> 
        <Binding Path="AddedOn" FallbackValue="[Added On]" TargetNullValue="n/a" /> 
        <Binding Path="ModifiedOn" FallbackValue="[Modified On]" TargetNullValue="n/a" /> 
        <Binding Path="RemovedOn" FallbackValue="[Removed On]" TargetNullValue="n/a" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </DataTemplate> 
</Window.Resources> 

<local:MyListBox ItemsSource="{Binding Samples}"> 
    <local:MyListBox.ListRows> 
     <local:MyListBoxRow Description="Number, Description" 
          IsDisplayed="True" 
          IsRequired="True" 
          RowTemplate="{StaticResource NumberDescriptionDataTemplate}" /> 
     <local:MyListBoxRow Description="Notes" 
          IsDisplayed="True" 
          IsRequired="False" 
          RowTemplate="{StaticResource NotesDataTemplate}" /> 
     <local:MyListBoxRow Description="Added, Modified, Removed" 
          IsDisplayed="True" 
          IsRequired="False" 
          RowTemplate="{StaticResource AuditDataTemplate}" /> 
    </local:MyListBox.ListRows> 
</local:MyListBox> 
</Window> 

回答

3

您可以使用其他來源比DataContext的,如果不是,你需要在這一點上有什麼。在使用ItemsControls時,您通常可能需要訪問所述控件的DataContext,而不是正在模板化的項目,因此您可以使用RelativeSource-Binding(例如,

{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=DataContext.Data} 

這是一個例子,搞不清我得到了整個的建築,你可能需要去適應它。

+0

謝謝。我有使用RelativeSource的經驗,但不知道在Path中使用DataContext。我也使用AncestoryType = {x:Type ListBoxItem},所以我可以綁定到「行」數據。 –

相關問題