【问题标题】:Listbox in WPF: Items collection must be empty before using ItemsSourceWPF 中的列表框:使用 ItemsSource 之前,项目集合必须为空
【发布时间】:2017-10-09 18:18:46
【问题描述】:

我遇到了 WPF 中的 ItemsSource 属性(用于绑定)的一些问题。当我将“ItemsSource="{Binding}" 作为我的 ListBox 的属性时,我无法运行我的程序。虽然,如果我删除它,程序运行良好,但绑定不起作用。

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 之前必须为空 错误。有人知道我的问题是什么吗?

【问题讨论】:

  • 什么是// Reading the file, this works fine?你在listeUtilisateurs.Items那里添加什么吗?
  • 您应该使用ObservableCollection 填充ListeBoxUtilisateurs,而不是其他方式。只需将其ItemsSource 绑定到ObservableCollection。向ObservableCollection 添加项目、从中删除、清除等。ListBox 将相应更新。

标签: c# wpf xaml listbox


【解决方案1】:

在我看来,您的绑定似乎关闭了。

  1. 您声明DataContext 应为空Coll - 也许您刚刚删除了代码。
  2. 您应该在调用InitializeComponent() 之前设置DataContext,以防止重-不必要-DataContextChanged 事件处理
  3. 您的 TextBoxes 比绑定到 DataContext - 为什么集合应该具有 NomTéléphone 等属性
  4. 为什么你有会员SelectedItem,你从来不用它?

我会在您的窗口中推荐以下成员:

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

(将 object 更改为您的实际类型)

也许 - 也许是因为我无法判断属性是否在列表视图的对象内 - 将所有 TextBoxes 更改为具有以下绑定:

<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"/>

【讨论】:

    猜你喜欢
    • 2012-08-02
    • 2014-01-07
    • 2016-01-04
    • 1970-01-01
    • 2012-07-24
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多