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