如何避免数据绑定中的覆盖?
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。
您的代码中还有其他新设计缺陷:
应该不需要在 .xaml.cs“代码隐藏”中设置 DisplayMember 和 ValueMember。相反,它属于 xaml 代码本身,因为它们是静态的。
作为更一般的建议,请考虑不要在您的代码中执行任何类型的“业务规则”或数据保存。相反,您喜欢将 UI(“视图”)与数据(“模型”)分开,而“ViewModel”将这两者分开并实施业务规则。关于此 MVVM 编程模式的介绍很多。
我是编程新手,在这里需要帮助...我想创建一个带有组合框项目的绑定。 但是 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。
您的代码中还有其他新设计缺陷:
应该不需要在 .xaml.cs“代码隐藏”中设置 DisplayMember 和 ValueMember。相反,它属于 xaml 代码本身,因为它们是静态的。
作为更一般的建议,请考虑不要在您的代码中执行任何类型的“业务规则”或数据保存。相反,您喜欢将 UI(“视图”)与数据(“模型”)分开,而“ViewModel”将这两者分开并实施业务规则。关于此 MVVM 编程模式的介绍很多。