2014-01-27 89 views
0

即時學習C#並想創建一個簡單的註冊和登錄表單來練習。我試圖使用MVVM模式。因爲將登錄數據存儲到文本文件中並且之後從中讀取以進行認證似乎更容易。但一個問題發生StreamWriter寫這樣的:System.Collections.ObjectModel.ObservableCollection`1 [LoginForm.Andmed.LoginData]StreamWriter MVVM C#寫入變量地址?

如果任何人都可以告訴什麼問題或如何解決我將非常感激。

視圖模型:

class LoginVM 
{ 
    public string path = @"C:\Users\Dell\Desktop\data.txt"; 
    private ObservableCollection<LoginData> andmed; // creating ObservableCollection of LoginData data. 

    public ObservableCollection<LoginData> Andmed 
    { 
     get { return andmed; } 
     set { andmed = value; } 
    } 
    public LoginVM() 
    { 
     this.andmed = new ObservableCollection<LoginData>(); 

    } 

    public void lisaAndmed(string user, string pass)//adds data to ObservableCollection 
    { 

     this.andmed.Add(new LoginData(user, pass)); 

    } 
    public void salvestaAndmed()// 
    { 


     StreamWriter SW = new StreamWriter(path, true); // using streamwriter to save data from the Collection to the path defined 
     SW.WriteLine(this.andmed); 
     SW.Close(); 


    } 
    public string autendi() // method for later purpose for authentification in login form. 
    { 
     StreamReader SR = new StreamReader(path); 

     path = SR.ReadToEnd(); 

     SR.Close(); 
     return path; 
    } 

屬性:

namespace LoginForm.Andmed 
{ 
public class LoginData 
{ 

    private string username; 
    private string password; 


    public string Username 
    { 
     get { return username; } 
     set { username = value; } 
    } 

    public string Password 
    { 
     get { return password; } 
     set { password = value; } 
    } 

    public LoginData(string _username, string _password) 
    { 

     this.password = _password; 
     this.username = _username; 


    } 
} 

}

模型視圖類:

public partial class MainWindow : Window 
{ 
    LoginVM mudel; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     mudel = new LoginVM(); 

     this.DataContext = mudel; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 

     if (user.Text.Length > 0 && pass1.Password == pass2.Password) 
     { 

      success.Text = "Successfuly registered!" + user.Text; 
      error.Text = ""; 
      mudel.lisaAndmed(user.Text, pass1.Password); // calling the method to add data into obsercablecooll 
      mudel.salvestaAndmed(); // now trying to save the data from obsservablecall 
     } 
     else if (pass1.Password != pass2.Password) 
     { 
      error.Text = "Passwords arent the same"; 

     } 
     else 
     { 

      error.Text = "Username incorrect!"; 

     } 
     Logimine logimine = new Logimine(); 
     logimine.ShowDialog(); 

    } 
} 
+0

你有什麼例外? – Joe

+0

沒有expections所有,只是寫入文本文件中的信息是在格式> System.Collections.ObjectModel.ObservableCollection'1 [LoginForm.Andmed.LoginData] – user3024888

回答

1

此:

SW.WriteLine(this.andmed); 

寫入ObservableCollection<T>.ToString()方法調用,這是默認類型名稱,因爲ObservableCollection<T>不會覆蓋Object.ToString()的結果。

您必須使用任何序列化程序來保存和加載ObservableCollection<LoginData>內容。例如,它可能是XmlSerializer

 var serializer = new XmlSerializer(typeof(ObservableCollection<LoginData>)); 
     var collection = new ObservableCollection<LoginData> 
     { 
      new LoginData { Username = "admin", Password = "123" }, 
      new LoginData { Username = "johndoe", Password = "456" } 
     }; 

     var sb = new StringBuilder(); 

     // serialize 
     using (var writer = new StringWriter(sb)) 
     { 
      serializer.Serialize(writer, collection); 
     } 

     // deserialize 
     using (var reader = new StringReader(sb.ToString())) 
     { 
      var collectionClone = serializer.Deserialize(reader); 
     } 
+0

但是,如果我想將數據添加到「收藏VAR =新的ObservableCollection 「從文本框,然後我必須創建該方法到MainWindows類? – user3024888

+0

@ user3024888:你已經有了這個方法 - 'salvestaAndmed'。你需要修復它。 – Dennis