Использование шаблона проектирования MVVM
Модель представлена в виде класса 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