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