如何避免数据绑定中的覆盖?

How to avoid the overwriting in the DataBinding?

我是编程新手,在这里需要帮助...我想创建一个带有组合框项目的绑定。 但是 DataBinding 并没有添加新的 DataBind,它会因为循环而覆盖旧的。所以我想如果你 select 组合框中的“Profilname”将显示“路径”。

但是到目前为止,由于覆盖,只会显示最后加载的 .txt 文件。

现在我的问题是:如何避免在 (foreach) 循环中覆盖 DataBind?

供参考:有一个文件夹包含许多 .txt 文件,它们都称为:“profile.txt”。程序用一个循环搜索所有文件,然后用另一个循环在文件中搜索一行,其中包含单词“profile_name”。然后 Name 必须显示在 ComboBox 中,Path 必须绑定到 ComboBox 中的“Item”/“Text”。

我希望这是可以理解的,如果我的代码令人困惑或写得不是很好,我很抱歉,我正在学习...

            foreach (string profiletxt in Directory.EnumerateFiles(profiledirectory, "profile.txt", SearchOption.AllDirectories))
            {
                foreach (string line in System.IO.File.ReadAllLines(profiletxt))
                {
                    if (line.Contains("profile_name"))
                    {
                        string remLine = line.Remove(0, 15);
                        string dLine = remLine.Replace("\"", "");
                        // dataBinding
                        var listProfiles = new List<Profile>() {
                        new Profile() {Path = profiletxt, Name = dLine,},
                        };

                        materialComboBox1.DataSource = listProfiles;
                        materialComboBox1.DisplayMember = "Name";
                        materialComboBox1.ValueMember = "Path";
                    }
                    
                }
                if (materialComboBox1.SelectedIndex == -1)
                {
                    MessageBox.Show("Error, couldn't find Profiles");
                }
            }


        public class Profile
        {
            public string Path {   get; set; }
            public string Name { get; set; }
        }

ComboBox 使用其包含可用项目的 ItemSource。在您的内部 foreach 循环中,您为每个发现的配置文件项声明一个新的配置文件列表:

var listProfiles = new List<Profile>() {
    new Profile() {Path = profiletxt, Name = dLine,},
};

materialComboBox1.DataSource = listProfiles;

相反,您可能希望在第一个 foreach 循环之前创建一个新的配置文件列表

var listProfiles = new List<Profile>();

并在内部循环中,将您的新发现添加到列表中

listProfiles.Add(new Profile() {Path = profiletxt, Name = dLine});

然后,在外层循环之后,您只能分配一次新的 ItemSource。

您的代码中还有其他新设计缺陷:

  1. 应该不需要在 .xaml.cs“代码隐藏”中设置 DisplayMember 和 ValueMember。相反,它属于 xaml 代码本身,因为它们是静态的。

  2. 作为更一般的建议,请考虑不要在您的代码中执行任何类型的“业务规则”或数据保存。相反,您喜欢将 UI(“视图”)与数据(“模型”)分开,而“ViewModel”将这两者分开并实施业务规则。关于此 MVVM 编程模式的介绍很多。