抱歉只有一张图片,但已经把问题呈现地足够清晰了
更新:全部代码:
注:这是.Net MAUI跨平台应用,用.net 6.0,Nuget开发包是communityToolkit.MVVM
namespace PasswordSaver.ViewModels
{
public partial class MainPageModel : ObservableObject
{
public MainPageModel()
{
Items = new ObservableCollection<info>();
}
[ObservableProperty]
string website;
[ObservableProperty]
string password;
[ObservableProperty]
ObservableCollection<info> items;
string SaveFilePath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "SaverFile.txt");
[RelayCommand]
void LoadMainPage()
{
List<string> dataString = new List<string>();
if (SaveFilePath == null || !File.Exists(SaveFilePath))
{
return;
}
using (StreamReader reader = new StreamReader(SaveFilePath, true))
{
while (!reader.EndOfStream)
{
dataString.Add(reader.ReadLine());
}
}
info[] datainfo = new info[dataString.Count];
int m = 0;
for(int i = 0; i < datainfo.Length; i++)
{
datainfo[i].websiteText = new string(dataString[m]);
datainfo[i].passwordText = new string(dataString[m + 1]);
m+=2;
}
for(int i = 0; i < datainfo.Length; i++)
{
items.Add(datainfo[i]);
}
}
[RelayCommand]
void Add()
{
info infos = new info();
if (string.IsNullOrWhiteSpace(Website) || string.IsNullOrWhiteSpace(Password))
{
return;
}
infos.websiteText = Website;
infos.passwordText = Password;
IEnumerable<info> value = items.Where(x => x.websiteText == Website && x.passwordText == Password);
if (value.Count() > 0)//where方法
{
infoIsSame.isSame = true;
return;
}
Items.Add(infos);
//置空两个输入框Entry
Website = string.Empty;
Password = string.Empty;
}
[RelayCommand]
void Delete(info speci)
{
if (items.Contains(speci))
{
items.Remove(speci);
}
}
[RelayCommand]
async void Save()
{
List<info> data = items.ToList();
string[] infoString = new string[2*data.Count];
int j = 0;
for(int i = 0; i < 2*data.Count; i+=2)
{
infoString[ i] = data[j].websiteText.ToString();
infoString[ i+1] = data[j].passwordText.ToString();
j++;
}
using(StreamWriter writer = File.CreateText(SaveFilePath))
{
for(int k=0; k < infoString.Length; k++)
{
await writer.WriteLineAsync(infoString[ k]);
}
}
}
}
}
看着不像这里报的错,可以点开详情看看具体错误行,如果错误行的确是这里,你可以重新编译一下程序,看看错误行是否有改变。
因为我觉得你的info这里定义有点问题
要读的path 里文本有数据吗?
await是干啥的
using块里的东西出了using块就释放了
你不要让它作为异步操作的参数呀
这里必须改成同步操作
要么你就等异步操作结束后再释放