5 votes

WPF - Liaison à une liste dans un élément de Listview

J'essaie de me lier à une liste dans un élément ListView mais je n'arrive pas à obtenir une liaison correcte. Si quelqu'un pouvait m'aider à corriger cette liaison, ce serait formidable !

Voici la source dont vous aurez probablement besoin :

//class that xaml is initially bound to
public partial class UploadMngPanel : Grid
{
    ....
    //initial list to bind to
    public ObservableCollection<FinishedAnimeCollection> UploadedAnime
    {
        get { return uploadedAnime; }
    }
}

public class FinishedAnimeCollection
{
    ...
    //second list to bind to
    private ObservableCollection<AnimeEpisodeItem> _episodes = new ObservableCollection<AnimeEpisodeItem>();

    public ObservableCollection<AnimeEpisodeItem> Episodes
    {
        get { return _episodes; }
    }
 }

public class AnimeEpisodeItem
{
    public String Title { get; set; }

    public DateTime TimeAdded { get; set; }
}

Le XAML que j'essaie de corriger est le suivant

<!-- First list binding here (this works)-->
<ListView Name="finishedView" ItemsSource="{Binding UploadedAnime}">
 <ListView.Resources>
  <ResourceDictionary>
   <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="AnimeExpander.xaml"/>
   </ResourceDictionary.MergedDictionaries>

   <DataTemplate x:Key="AnimeRow">
    <DockPanel>
     <!-- <Image Height="75" Width="Auto" Source="{Binding Image}" DockPanel.Dock="Left" VerticalAlignment="Top"/> -->
     <Expander Template="{StaticResource AnimeExpanderControlTemplate}" Header="{Binding AnimeTitle}">
      <Expander.ContentTemplate>
       <DataTemplate>
        <Border BorderBrush="Black" BorderThickness="1,1,1,1">
         <!--Second list binding here (this doesn't work)-->
         <ListView ItemsSource="{Binding Path=Episodes}">
          <ListViewItem>
           <DockPanel>
            <TextBlock Text="{Binding Title}" DockPanel.Dock="Left" />
            <!--<TextBlock Text="{Binding TimeAdded}" DockPanel.Dock="Right" />-->
           </DockPanel>
          </ListViewItem>              
         </ListView>
        </Border>
       </DataTemplate>
      </Expander.ContentTemplate>
     </Expander>
    </DockPanel>       
   </DataTemplate>        
  </ResourceDictionary>     
 </ListView.Resources>

 <ListView.View>
  <GridView>
   <GridViewColumn Width="700" Header="Anime" CellTemplate="{StaticResource AnimeRow}"/>       
  </GridView>
 </ListView.View>

</ListView>

Si vous avez besoin de plus de code source, faites-le moi savoir. Merci beaucoup !

1voto

Josh Points 36

Ok, après avoir fait un peu plus de bêtises, j'ai finalement trouvé comment faire. Apparemment ça :

 <ListView ItemsSource="{Binding Path=Episodes}">
       <ListViewItem>
          <DockPanel>
             <TextBlock Text="{Binding Title}" DockPanel.Dock="Left" />
             <!--<TextBlock Text="{Binding TimeAdded}" DockPanel.Dock="Right" />-->
          </DockPanel>
        </ListViewItem>                                                     
  </ListView>

n'est pas valide même s'il ne l'était pas par erreur. Lorsque vous spécifiez un ItemSource pour une vue de liste, vous ne pouvez pas utiliser la balise ListViewItem dans la vue de liste. J'ai donc retravaillé mon code dans le sens suivant qui fonctionne :

<TabItem Header="Finished">
            <TabItem.Resources>
                <ResourceDictionary>
                        <ResourceDictionary.MergedDictionaries>
                            <ResourceDictionary Source="AnimeExpander.xaml"/>
                        </ResourceDictionary.MergedDictionaries>

                        <DataTemplate x:Key="EpisodeItem">
                            <DockPanel Margin="30,3">
                                <TextBlock Text="{Binding Title}" DockPanel.Dock="Left" />
                                <WrapPanel Margin="10,0" DockPanel.Dock="Right">
                                    <TextBlock Text="Finished at: " />
                                    <TextBlock Text="{Binding TimeAdded}" />
                                </WrapPanel>
                            </DockPanel>
                        </DataTemplate>

                        <DataTemplate x:Key="AnimeItem">
                            <DockPanel Margin="5,10">
                                <Image Height="75" Width="Auto" Source="{Binding ImagePath}" DockPanel.Dock="Left" VerticalAlignment="Top"/> 
                                <Expander Template="{StaticResource AnimeExpanderControlTemplate}" >
                                    <Expander.Header>
                                        <TextBlock FontWeight="Bold" Text="{Binding AnimeTitle}" />
                                    </Expander.Header>

                                        <ListView ItemsSource="{Binding Episodes}" ItemTemplate="{StaticResource EpisodeItem}" BorderThickness="0,0,0,0" />

                                </Expander>
                            </DockPanel>                            
                        </DataTemplate>                         
                    </ResourceDictionary>           
            </TabItem.Resources>

            <ListView Name="finishedView" ItemsSource="{Binding UploadedAnime, diagnostics:PresentationTraceSources.TraceLevel=High}" ItemTemplate="{StaticResource AnimeItem}" />                  
</TabItem>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X