Silverlight 4 - 可观察的集合(启动时加载)

时间:2011-10-03 15:00:54

标签: c# silverlight visual-studio-2010 silverlight-4.0

我是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; }


    }
}

3 个答案:

答案 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