我是Silverlight和C#的新手,我刚刚创建了一个允许用户添加书籍(标题,作者和描述)的小应用程序,他们也可以使用自动完成框搜索这些字段。
现在,我只使用了一次可观察的集合,我知道如何使用它的唯一方法是使用按钮(一个用于保存,一个用于加载集合)。但是,我希望能够在应用程序启动时自行加载集合,以便我可以删除该按钮。
有人可以告诉我如何做到这一点?我也在使用MVVM,以防这很重要。
额外的布朗尼点,如果您还可以告诉我如何在退出应用程序时保存该集合(但这是一件好事)
提前大力表示感谢 DOM
以下是一些代码,很抱歉以前没有发布过。
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 :(得分: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();
}
答案 1 :(得分:1)
如果您使用MVVM,我建议View Model
将Collection加载到Model
。完成此操作后,ObservableCollection将引发更改,如果您将集合绑定到View
,您将看到数据。
答案 2 :(得分:0)
查看名为App.xaml的文件。那里有一个名为Application_Startup的事件。
http://msdn.microsoft.com/en-us/library/system.windows.application.startup(v=vs.95).aspx