在没有ItemsSource绑定的情况下将.txt文件读取到列表框,或者在不清除行列表框的情况下删除绑定

如何解决在没有ItemsSource绑定的情况下将.txt文件读取到列表框,或者在不清除行列表框的情况下删除绑定

我对C#相当陌生,但了解基本概念。

我目前正在处理Uni作业,我必须在列表框中将多个文本框作为一个条目输入,然后将所有条目保存到文本文件中。我还需要能够加载文本文件并将新条目添加到列表中。

我已经弄清楚了如何将数据保存到.txt文件,以及如何使用.pp将.txt文件重新加载到列表框中。

if (File.Exists("PersonalFile.txt"))
{
 string[] line = File.ReadAllLines("PersonalFile.txt");
 lbxStaffDetails.ItemsSource = line;
}

但是,由于无法进行数据绑定,因此无法将新条目添加到列表框中,因此出现此错误消息 System.InvalidOperationException:'在使用ItemsSource时操作无效。而是使用ItemsControl.ItemsSource访问和修改元素。'

是否可以删除绑定但将数据保留在列表框中?使用lbxStaffDetails.ItemsSource = null;清除列表框;还是有另一种方法可以将.txt文件的所有行都读取到列表框中,而无需将该文件用作绑定源?

注意:

  • lbxStaffDetails是有问题的此列表框
  • PersonalFile.txt是.txt,用于保存新行中的条目。
  • 这是我第一次绑定数据和文件。

编辑:

忘记提及我是如何将数据添加到列表框中的,因此这里是代码。

private void btnAddWaitingList_Click(object sender,RoutedEventArgs e)
{
 _EmployeeID = tbxEmployeeID.Text;
 _Name = tbxName.Text;
 _PayRate = tbxPayRate.Text;            
 _Email = tbxEmail.Text;

 string employeeDetails = _EmployeeID + "," + _Name + "," + _PayRate + "," + _Email;

 lbxStaffDetails.Items.Add(employeeDetails);
}

当代码触发并到达最底行时,它将引发上述错误。

解决方法

不要将数据绑定与简单的值分配混淆。数据绑定是一个不同的概念,其中目标使用Binding绑定到数据源。 Binding将监视目标和源,并将更改从一个委派到另一个。这是双向动态数据链接。
您可以在XAML或C#中设置Binding(请参见Data binding overview in WPF)。

您没有将ListBox绑定到文件。您已将文件内容读取为字符串数组。然后,将此数组分配给ListBox.ItemsSource属性。

由于使用ListBox属性填充了ItemsSource,因此不允许使用Items属性(InvalidOperationException)修改其项目。
您必须将修改后的集合再次分配给ListBox.ItemsSource(这将导致完整的ListBox重新创建所有项目,这对性能不利)或使用ObservableCollection。 / p>

这是一个特殊的集合,可以观察到(观察者模式)。观察者会通过事件通知观察者集合已更改(添加/移动/删除)。每个ItemsControl都可以收听此事件,并且会自动更新。

MainWindow.xaml.cs

partial class MainWindow : Window
{
  public ObservableCollection<string> StaffDetails { get; set; }

  public MainWindow()
  {
    InitializeComponent();

    // Set the DataContext to MainWindow for data binding (XAML version)
    this.DataContext = this;
  }

  private void ReadFile()
  {    
    if (!File.Exists("PersonalFile.txt"))
    {
      return;
    }
     
    string[] lines = File.ReadAllLines("PersonalFile.txt");
    
    // Create a new ObservableCollection and initialize it with the array
    this.StaffDetails = new ObservableCollection<string>(lines);

    // You write to the file using this same collection directly,// without accessing the ListBox
    File.WriteAllLines("PersonalFile.txt",this.StaffDetails);
    
    // Option 1: assignment (static data link)
    this.lbxStaffDetails.ItemsSource = this.StaffDetails;
    
    // Alternative option 2: C# data binding (dynamic data link)
    var binding = new Binding(nameof(this.StaffDetails)) { Source = this };
    this.lbxStaffDetails.SetBinding(ItemsControl.ItemsSourceProperty,binding);
    
    // Alternative option 3 (recommended): XAML data binding (dynamic data link). See MainWindow.xaml
  }

  private void btnAddWaitingList_Click(object sender,RoutedEventArgs e)
  {
    _EmployeeID = tbxEmployeeID.Text;
    _Name = tbxName.Text;
    _PayRate = tbxPayRate.Text;            
    _Email = tbxEmail.Text;
    
    var employeeDetails = $"{_EmployeeID},{_Name},{_PayRate},{_Email}";
    
    // Modify the ObservableCollection. 
    // Since ListBox is observing this collection,it will automatically update itself
    this.StaffDetails.Add(employeeDetails);
  }
}

MainWindow.xaml

<Window>

  <!-- Alternative option 3: XAML data binding (recommended) -->
  <ListBox x:Name="lbxStaffDetails" 
           ItemsSource="{Binding StaffDetails}" />
</Window>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-