2017-10-09 2 views
0

Je rencontre des problèmes avec la propriété ItemsSource dans WPF (pour la liaison). Je ne peux pas exécuter mon programme tout en ayant le "ItemsSource =" {Binding} "comme propriété pour ma ListBox Bien que, si je le supprime, le programme fonctionne bien mais la liaison ne fonctionne pasListbox dans WPF: La collection d'éléments doit être vide avant d'utiliser ItemsSource

XAML:

<Window x:Class="TP1.EcranPrincipal" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TP1" 
     mc:Ignorable="d" 
     Background="CornflowerBlue" 
     Title="" Height="400" Width="700"> 

    <Window.Resources> 
     <DataTemplate x:Key="masterTemplate"> 
      <TextBlock 
      Margin="4" 
      Text="{Binding Description,UpdateSourceTrigger=PropertyChanged}"/> 
     </DataTemplate> 
    </Window.Resources> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="2*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="2*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="2*"/> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <TextBox Grid.Column="1" Grid.Row="0" Padding="5" VerticalContentAlignment="Center" Margin="10,10,90,0" TextWrapping="NoWrap" Text="" VerticalAlignment="Top" Grid.ColumnSpan="4"/> 
     <Button x:Name="BoutonRechercher" Grid.Column="4" Grid.Row="0" Padding="5" Content="Rechercher" HorizontalAlignment="Left" Margin="88,9,0,0" VerticalAlignment="Top" Click="BoutonRechercher_Click" Width="75"/> 

     <!-- 1st TextBoxes' column --> 
     <TextBox x:Name="Nom" Text="{Binding Nom,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Grid.Row="1" Margin="0, 0, 10, 10" VerticalContentAlignment="Center"/> 
     <TextBox x:Name="Telephone" Text="{Binding Téléphone,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Grid.Row="2" Margin="0, 0, 10, 10" VerticalContentAlignment="Center" Padding="5,0" /> 
     <TextBox x:Name="Adresse1" Text="{Binding Adresse1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Grid.Row="3" Margin="0, 0, 10, 10" Grid.ColumnSpan="3" VerticalContentAlignment="Center"/> 
     <TextBox x:Name="Adresse2" Text="{Binding Adresse2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Grid.Row="4" Margin="0, 0, 10, 10" Grid.ColumnSpan="3" VerticalContentAlignment="Center"/> 
     <TextBox x:Name="Ville" Text="{Binding Ville,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Grid.Row="5" Margin="0, 0, 10, 10" VerticalContentAlignment="Center"/> 
     <TextBox x:Name="Pays" Text="{Binding Pays,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Grid.Row="6" Margin="0, 0, 10, 10" VerticalContentAlignment="Center"/> 

     <!-- 2nd TextBoxes' column --> 
     <TextBox x:Name="Prenom" Text="{Binding Prénom,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="4" Grid.Row="1" Margin="0, 0, 10, 10" VerticalContentAlignment="Center"/> 
     <TextBox x:Name="Courriel" Text="{Binding Courriel,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="4" Grid.Row="2" Margin="0, 0, 10, 10" VerticalContentAlignment="Center"/> 
     <TextBox x:Name="Province" Text="{Binding Province,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="4" Grid.Row="5" Margin="0, 0, 10, 10" VerticalContentAlignment="Center"/> 
     <TextBox x:Name="CodePostal" Text="{Binding CodePostal,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="4" Grid.Row="6" Margin="0, 0, 10, 10" VerticalContentAlignment="Center"/> 

     <ListBox x:Name="ListeBoxUtilisateurs" ItemsSource="{Binding}" ItemTemplate="{StaticResource masterTemplate}" IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" Height="349" Margin="10,10,0,0" VerticalAlignment="Top" Width="153" Grid.RowSpan="7"/> 


    </Grid> 
</Window> 

C#.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 

// StreamReader/Writer: 
using System.IO; 
using System.ComponentModel; 

namespace TP1 
{ 
    /// <summary> 
    /// Logique d'interaction pour EcranPrincipal.xaml 
    /// </summary> 
    public partial class EcranPrincipal : Window 
    { 

     // Required variables to read the file 
     List<String> elementsLignes = new List<String>(); 
     List<Utilisateur> utilisateurs = new List<Utilisateur>(); 
     Collection Coll = new Collection(); 



     public EcranPrincipal() 
     { 
      InitializeComponent(); 
      this.DataContext = Coll; 
      ListBox listeUtilisateurs = ListeBoxUtilisateurs; 

      var reader = new StreamReader(File.OpenRead("TextFile.txt")); 
      int nbUtilisateurs = 0; 

      Console.WriteLine(reader.ReadLine()); 

      while (reader.ReadLine() != null) 
      { 
       // Reading the file, this works fine 
      } 
     } 


     private ListBoxItem selectedItem; 
     public ListBoxItem SelectedItem 
     { 
      get { return selectedItem; } 
      set { selectedItem = value; } 
     } 
    } 
} 

Chaque fois que je lance mon programme, je reçois cette collection Items doit être vide avant d'utiliser l'erreur ItemsSource Quelqu'un compris ce que mon problème est

?
+1

Qu'est-ce que '// Lecture du fichier, cela fonctionne très bien»? Ajoutez-vous quelque chose à 'listeUtilisateurs.Items' là? –

+0

Vous devez remplir 'ListeBoxUtilisateurs' avec un' ObservableCollection' et pas d'autre manière. Il suffit de lier son 'ItemsSource' à' ObservableCollection'. Ajoutez des éléments à 'ObservableCollection', supprimez-les, effacez-les, etc. Le ListBox sera mis à jour en conséquence. –

Répondre

2

Vos reliures semblent off, à mon avis.

  1. vous déclarez que le DataContext doit être un vide Coll - peut-être vous laissiez tomber le code.
  2. Vous devez définir le DataContext avant l'appel InitializeComponent() pour éviter lourde - inutile - DataContextChanged Gestion des événements
  3. Votre TextBoxes que se lier à cette DataContext - pourquoi une collection possèdent des propriétés comme Nom, Téléphone et ainsi de suite
  4. Pourquoi vous avez le membre SelectedItem quand vous ne l'utilisez jamais?

Je recommande les membres suivants dans votre fenêtre:

public ObservableCollection<object> Coll { get; set; } 
public object SelectedItem { get; set; } 

(changement object à votre type actualy vous avez)

Peut-être - peut-être parce que je ne peux pas dire si les propriétés sont à l'intérieur du objet de la liste ou non - changer tous vos TextBoxes pour avoir la liaison suivante:

<TextBox x:Name="Nom" Text="{Binding SelectedItem.Nom, UpdateSourceTrigger=PropertyChanged}" /> 

Modifiez votre ListBox à ceci:

<ListBox x:Name="ListeBoxUtilisateurs" ItemsSource="{Binding Coll}" SelectedItem="{Binding SelectedItem}" ItemTemplate="{StaticResource masterTemplate}" HorizontalAlignment="Left" Height="349" Margin="10,10,0,0" VerticalAlignment="Top" Width="153" Grid.RowSpan="7"/>