2017-10-09 163 views
0

我有WPF中的ItemsSource属性(用于绑定)的一些问题。我不能运行我的程序,同时让“ItemsSource =”{Binding}“作为我的ListBox属性,尽管如果我删除它,程序运行正常,但绑定不起作用在WPF中的列表框:项目集合必须为空之前使用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; } 
     } 
    } 
} 

每次我跑我的程序,我得到这个Items集合必须是空在使用ItemsSource错误之前,任何人都想通了,我的问题是什么

+1

什么是读取文件,这工作正常?你在那里向'listeUtilisateurs.Items'添加了什么? –

+0

您应该使用'ObservableCollection'来填充'ListeBoxUtilisateurs',不能以其他方式。只需将其“ItemsSource”绑定到“ObservableCollection”。将项目添加到'ObservableCollection',将它们从中删除,清除它等等。ListBox将相应地更新。 –

回答

2

在我看来,你的绑定看起来不错。

  1. 你宣布该DataContext应是空Coll - 也许你只是下降的代码。
  2. 应设置DataContext电话InitializeComponent()之前防止重 - 不必要的 - DataContextChanged事件处理
  3. TextBoxes比绑定到DataContext - 集合何必非要属性,如NomTéléphone
  4. 为什么你从来没有使用过会员SelectedItem

我建议以下成员在自己的窗口:

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

(更改object您actualy类型你有)

也许 - 也许是因为我不能告诉我们,如果属性是内部的列表视图与否的对象 - 更改所有文本框有以下绑定:

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

将您的列表框更改为:

<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"/> 
相关问题