Silverlight 4 - Наблюдаемые коллекции (загрузка при запуске) - PullRequest
0 голосов
/ 03 октября 2011

Я довольно новичок в 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 ]

2 голосов
/ 04 октября 2011

Вы должны просто иметь возможность загрузить коллекцию (похоже, что метод - LoadResults) в конструкторе ViewModel. Итак, примерно так:

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 голос
/ 03 октября 2011

Если вы используете MVVM, я предлагаю, чтобы View Model загрузил коллекцию в Model. Как только это будет сделано, ObservableCollection сгенерирует изменение, и если вы связали коллекцию с View, вы увидите данные.

0 голосов
/ 03 октября 2011

Загляните в файл с именем App.xaml. Там есть событие с именем Application_Startup.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...