2011-10-03 56 views
0

我對Silverlight和C#很新穎,我剛剛製作了一個允許用戶添加書籍(標題,作者和說明)的小應用程序,他們也可以使用自動完成框搜索這些字段。Silverlight 4 - 可觀察的集合(啓動時加載)

現在,我只使用了一次可觀察集合,我知道如何使用它的唯一方法是使用按鈕(一個用於保存,另一個用於加載集合)。但是,我希望能夠在應用程序啓動時自動加載集合,以便我可以刪除按鈕。

有人可以請告訴我如何做到這一點?我也使用MVVM,以防萬一這很重要。如果

額外加分,你也可以告訴我如何保存在退出該應用程序的集合(但是這是一個不錯的)

大規模提前感謝 大教堂

下面是一些代碼,對不起,以前沒有發佈。

MainViewModel

using System.Collections.ObjectModel; 
using System.IO; 
using System.IO.IsolatedStorage; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 
using System.Xml; 
using PTL.Legal.CRM.Silverlight.Common.Commanding; 

namespace BookSearch1._1.ViewModels 
{ 
    public class MainViewModel : ViewModelBase 
    { 
     private BookViewModel _selectedBook; 

     #region Constructor 
     public MainViewModel() 
     { 
      SubmitCommand = new DelegateCommand<object>(AddBook); 
      SaveCommand = new DelegateCommand<object>(SaveResults); 
      LoadCommand = new DelegateCommand<object>(LoadResults); 
      Books = new ObservableCollection<BookViewModel>(); 
      SelectedBook = new BookViewModel(); 
     } 

     #endregion 

     #region Properties 

     public void AddBook(object obj) 
     { 
      Books.Add(SelectedBook); 
     } 

     public ICommand SubmitCommand { get; set; } 
     public ICommand SaveCommand { get; set; } 
     public ICommand LoadCommand { get; set; } 

     public BookViewModel SelectedBook 
     { 
      get { return _selectedBook; } 
      set { _selectedBook = value; OnPropertyChanged("SelectedBook"); } 
     } 

     public void SaveResults(object obj) 
     { 
      //using (var isf = IsolatedStorageFile.GetUserStoreForApplication()) 
      //{ 
      // using (IsolatedStorageFileStream isoStream = 
      //  new IsolatedStorageFileStream("MainSettings.xml", FileMode.Create, isf)) 
      // { 
      //  var settings = new XmlWriterSettings(); 
      //  settings.Indent = true; 

      //  using (XmlWriter writer = XmlWriter.Create(isoStream, settings)) 
      //  { 
      //   writer.WriteStartElement("UserSettings"); 

      //   foreach (string result in Books) 
      //   { 
      //    writer.WriteStartElement("Result"); 
      //    writer.WriteString(result); 
      //    writer.WriteEndElement(); 
      //   } 


      //   writer.WriteEndElement(); 

      //   writer.Flush(); 
      //  } 
      // } 
      //} 

      //MessageBox.Show("Settings applied."); 
     } 

     public void LoadResults(object obj) 
     { 
      //using (var isf = IsolatedStorageFile.GetUserStoreForApplication()) 
      //{ 
      // var storStream = 
      //  new StreamReader(new IsolatedStorageFileStream("MainSettings.xml", FileMode.Open, isf)); 

      // var xmlReaderSettings = new XmlReaderSettings 
      //        { 
      //         IgnoreWhitespace = true, 
      //         IgnoreComments = true, 
      //         CheckCharacters = true 
      //        }; 

      // XmlReader xmlReader = XmlReader.Create(storStream, xmlReaderSettings); 

      // while (xmlReader.Read()) 
      // { 
      //  if (xmlReader.NodeType == XmlNodeType.Element && 
      //   "Result" == xmlReader.LocalName) 
      //  { 
      //   Books.Add(xmlReader.ReadElementContentAsString()); 
      //  } 
      // } 

      // xmlReader.Close(); 
      //} 
     } 

     #endregion 

     public AutoCompleteFilterPredicate<object> CustomFilter 
     { 
      get 
      { 
       return new AutoCompleteFilterPredicate<object>(SearchBooks); 
      } 
     } 


     bool SearchBooks(string search, object value) 
     { 
      // Cast the value to an Employee. 
      var books = value as BookViewModel; 
      if (books != null) 
      { 
       // Look for a match in the first and last names. 
       if (SelectedBook.Title.ToLower().Contains(search.ToLower()) || SelectedBook.Author.ToLower().Contains(search.ToLower()) || SelectedBook.Description.ToLower().Contains(search.ToLower())) 
        return true; 

      } 
      // If no match, return false. 
      return false; 
     } 

     public ObservableCollection<BookViewModel> Books { get; set; } 


    } 
} 
+0

請張貼一些關於您的邏輯的代碼。謝謝 –

+0

我發佈了MainViewModel,希望這有助於,謝謝 – domsbrown

+0

檢查Daok和dev.bv的答案。這是正確的方向。另外,我應該重構你的代碼,但屬於http://codereview.stackexchange.com/ –

回答

0

查找一個名爲App.xaml文件。在那裏有一個名爲Application_Startup的事件。

http://msdn.microsoft.com/en-us/library/system.windows.application.startup(v=vs.95).aspx

+0

非常感謝,我不知道在哪裏可以找到它。 由於這個,我確實有另一個noob問題。我有一個名爲Books(它在MainViewModel中)的集合,它告訴我名稱Books不存在於當前上下文中。 我對此的理解是需要引用MainViewModel,我認爲我需要繼承這個類,但App類已經從Application繼承,並且據我所知只能從一個類繼承? 正如我所說的,提出真正的noob問題,感謝您的幫助 – domsbrown

+0

您真的需要在應用第一次啓動時加載數據嗎?你不能在MainViewModel的構造函數中加載它嗎? MainViewModel是否在應用程序的整個生命週期中保留在內存中?我們需要更多關於您的應用的信息。 –

+0

再次感謝,很好的問題,我只是需要它來加載應用程序啓動時的集合,我不知道有另一種方式來做到這一點(再次,noob哈哈) 我已經發布了MainViewModel爲你看在:o) – domsbrown

1

如果使用MVVM我建議View Model負荷收集到Model。完成此操作後,ObservableCollection將引發更改,如果已將該集合綁定到View,您將看到數據。

+0

嗨,謝謝你的回覆。 我可能會讀你的回覆錯誤或不理解。該集合已經綁定到視圖,但目前用戶必須單擊按鈕才能將集合加載到列表框中,但希望集合在應用程序啓動時加載。 再次,抱歉,如果我剛剛誤解了你的回覆 – domsbrown

2

您應該能夠在ViewModel構造函數中加載集合(看起來像方法是LoadResults)。所以,有點像這樣:

public MainViewModel() 
{ 
    SubmitCommand = new DelegateCommand<object>(AddBook); 
    SaveCommand = new DelegateCommand<object>(SaveResults); 
    LoadCommand = new DelegateCommand<object>(LoadResults); 
    Books = new ObservableCollection<BookViewModel>(); 
    SelectedBook = new BookViewModel(); 

    LoadResults(); 

}