2011-10-03 7 views
0

저는 Silverlight 및 C#에 익숙하지 않습니다. 사용자가 책 (제목, 작성자 및 설명)을 추가 할 수 있도록 약간의 응용 프로그램을 만들었습니다. 자동 완성 상자로이 필드를 검색하십시오.Silverlight 4 - Observable Collections (시작시로드)

이제 관측 가능한 컬렉션을 한 번만 사용했는데 사용 방법을 알고있는 유일한 방법은 버튼을 사용하는 것입니다 (하나는 저장하고 하나는 컬렉션을로드하는 것입니다). 그러나 응용 프로그램이 시작될 때 컬렉션로드 자체를 가질 수 있으므로 버튼을 제거 할 수 있습니다.

누군가 내가이 작업을 수행 할 수있는 방법에 대해 조언을 구할 수 있습니까? MVVM도 중요하게 사용하고 있습니다. 당신은 또한 어떻게 응용 프로그램을 종료시 수집을 저장하는 말해 줄 수 (하지만이 가지고 멋진입니다) 사전 돔

대규모 감사

여분 브라우니 점을 경우 여기에 일부 코드 전에 게시하지 않아서 죄송합니다. App.xaml라는 이름의 파일에

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

로직에 대한 몇 가지 코드를 게시하십시오. thanks –

+0

MainViewModel을 게시했습니다. 덕분에 도움이 되었기를 바랍니다. – domsbrown

+0

Daok와 dev.bv의 답변을 확인하십시오. 그것은 올바른 방향입니다. 또한 코드를 리팩터링해야하지만 http://codereview.stackexchange.com/ –

답변

0

봐. 거기에 Application_Startup이라는 이벤트가 있습니다. 당신이 MVVM을 사용하는 경우

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

+0

에 속해 있습니다. 고마워요.이 위치를 찾을 수 있는지 확실하지 않았습니다. 그 결과로 다른 멍청한 문제가 생겼습니다. Books (MainViewModel에 있음)라는 컬렉션에 대한 참조가 있는데 Books라는 이름이 현재 컨텍스트에 존재하지 않는다고 알려줍니다. 이걸 이해하면 MainViewModel을 참조해야하는데,이 클래스는 상속 된 클래스가 있어야한다고 생각하지만 App 클래스는 이미 Application에서 상속 받았다. 한 가지 클래스 만 상속받을 수 있다는 것을 알고있다. ?? 내가 말했듯이, 진짜 noob 문제가 발생했습니다. 도움을 주셔서 감사합니다. – domsbrown

+0

앱을 처음 시작할 때 데이터를로드해야합니까? MainViewModel의 생성자에서로드 할 수 없습니까? MainViewModel이 애플리케이션 수명 동안 메모리에 남아 있습니까? 앱과 관련하여 좀 더 많은 정보가 필요합니다. –

+0

다시 한번 감사드립니다. 좋은 질문입니다. 응용 프로그램이 시작될 때 컬렉션을로드하기 만하면됩니다.이 작업을 수행 할 다른 방법이 있다는 것을 알지 못했습니다. MainViewModel을 게시했습니다. at : o) – domsbrown

1

은 내가 ModelView 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(); 

}