Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 464 / 16 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 6:

Использование шаблона проектирования MVVM

< Лекция 15 || Самостоятельная работа 6: 12345 || Лекция 18 >

Модель представлена в виде класса Accomplishment, он реализует интерфейс INotifyPropertyChanged и событие PropertyChanged, что позволяет ему сообщать об изменениях данных, что, в итоге, приводит к обновлению пользовательского интерфейса. То есть, данный класс готов к использованию его в системе привязки данных.

Название достижения (поле Name) и его тип (Type) не меняются при работе, а сведения о количестве собранных элементов (Count) и о том, завершен ли уровень (Completed) могут меняться.

В Листинге 23.2 приведен код файла ViewModel.cs. Это – модель представления, в которой используется коллекция Accomplishment, используемая для привязки данных.

using System;
using System.Windows;
using System.Collections.ObjectModel;
using System.IO.IsolatedStorage;
using sdkMVVMCS.Model;

namespace sdkMVVMCS.ViewModelNS
{
    public class ViewModel
    {
        public ObservableCollection<Accomplishment> Accomplishments { get; set; }


        public void GetAccomplishments()
        {
           //Если в изолированном хранилище имеются параметры
            if (IsolatedStorageSettings.ApplicationSettings.Count > 0)
            {
                // Получаем достижения из хрранилища
                GetSavedAccomplishments();
            }
            else
            {
                //Загружаем список достижений по умолчанию
                GetDefaultAccomplishments();
            }
        }

        //Загрузка списка по умолчанию
        public void GetDefaultAccomplishments()
        {
            ObservableCollection<Accomplishment> a = new ObservableCollection<Accomplishment>();

            // Элементы, которые нужно собрать
            a.Add(new Accomplishment() { Name = "Potions", Type = "Item" });
            a.Add(new Accomplishment() { Name = "Coins", Type = "Item" });
            a.Add(new Accomplishment() { Name = "Hearts", Type = "Item" });
            a.Add(new Accomplishment() { Name = "Swords", Type = "Item" });
            a.Add(new Accomplishment() { Name = "Shields", Type = "Item" });

            // Уровни, которые нужно пройти
            a.Add(new Accomplishment() { Name = "Level 1", Type = "Level" });
            a.Add(new Accomplishment() { Name = "Level 2", Type = "Level" });
            a.Add(new Accomplishment() { Name = "Level 3", Type = "Level" });

            Accomplishments = a;
            MessageBox.Show("Загружен список достижений, заданный по умолчанию");
        }

        //Загрузка списка из хранилища
        public void GetSavedAccomplishments()
        {
            ObservableCollection<Accomplishment> a = new ObservableCollection<Accomplishment>();

            foreach (Object o in IsolatedStorageSettings.ApplicationSettings.Values)
            {
                a.Add((Accomplishment)o);
            }

            Accomplishments = a;
            MessageBox.Show("Загружен список достижений из хранилища");
        }

       //Сохранение списка
        public void SaveAccomplishments()
        {
            IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

            foreach (Accomplishment a in Accomplishments)
            {
                if (settings.Contains(a.Name))
                {
                    settings[a.Name] = a;
                }
                else
                {
                    settings.Add(a.Name, a.GetCopy());
                }
            }

            settings.Save();
            MessageBox.Show("Сохранение достижений завершено");
        }
    }
}
Листинг 23.2. Код файла ViewModel.cs

Здесь же выполняется заполнение этой коллекции – либо данными по умолчанию, если пока нет сохранённых результатов работы, либо данными, полученными из изолированного хранилища приложения, куда они могут быть сохранены с помощью соответствующего метода, который так же расположен в данном классе.

В Листинге 23.3 приведен XAML-код файла ItemView.xaml. Его .CS-файл содержит лишь стандартный конструктор, инициализирующий элементы. Это – представление для вывода данных о собранных элементах.

<UserControl x:Class="sdkMVVMCS.View.ItemView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="480" d:DesignWidth="480">
    
    <Grid x:Name="LayoutRoot">
        <ListBox ItemsSource="{Binding}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200"/>
                            <ColumnDefinition Width="80"/>
                            <ColumnDefinition Width="100"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock x:Name="Item" Text="{Binding Path=Name, Mode=OneWay}" 
Grid.Column="0" HorizontalAlignment="Left" 
VerticalAlignment="Center" />
                        <TextBox x:Name="Count" Text="{Binding Path=Count, Mode=TwoWay}" 
Grid.Column="1" TextAlignment="Center" 
InputScope="Number"/>
                        <TextBlock x:Name="Check" Text="{Binding Path=Count, Mode=OneWay}" 
Grid.Column="2" HorizontalAlignment="Center" 
VerticalAlignment="Center" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</UserControl>
Листинг 23.3. Код файла ItemView.xaml
< Лекция 15 || Самостоятельная работа 6: 12345 || Лекция 18 >