куда я должен поместить мои данные, которые не будут сброшены во время работы программ в In MVVM - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть опыт работы с devel UWP и структурой кода.
Я новичок в дизайне MVVM, и я разрабатываю приложение UWP с шаблоном, MVVM Basic.

Я разрабатываю простое приложение, которое генерирует числа для лото. Чтобы помочь пониманию, я разместил свое изображение в приложении.
my App

Я реализовал с ViewModel с главной страницы. ниже мой источник.

На главной странице. Xaml

<ListView ItemsSource="{x:Bind ViewModel._display_game, Mode=OneWay}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="TextBlock">
            <TextBlock Text="{x:Bind Text,Mode=OneWay}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
<Button Grid.Column="1" Grid.Row="1" Content="Click Me" Command="{x:Bind ViewModel.game_create}"/>

MainPage.cs

public sealed partial class MainPage : Page
{
    public MainViewModel ViewModel { get; } = new MainViewModel();

    public MainPage()
    {
        DataContext = ViewModel;
        InitializeComponent();
    }
}

MainViewModel.cs

public class MainViewModel : Observable
{
    public ObservableCollection<TextBlock> _display_game { get; set; }

    private int[] game;
    public MainViewModel()
    {
        game_create = new RelayCommand(ExecuteClick);
    }
    private void ExecuteClick()
    {
        {  //generating 6 random value 
            _display_game = new ObservableCollection<TextBlock>();
            game = new int[6];
            Random random = new Random(DateTime.Now.Millisecond);
            for (int t = 0; t < 6; t++)
            {
                bool[] check = new bool[46];
                _display_game.Add(new TextBlock());

                int dup = 0;
                int cnt = 0;
                while (cnt < 6)
                {
                    int tmp = random.Next(1, 46);
                    if (check[tmp] == false)
                    {
                        check[tmp] = true;
                        game[cnt] = tmp;
                        cnt++;
                        //_display_game[t].Text += $"{tmp} ";
                    }
                    else dup++;
                }
                Array.Sort(game);
                _display_game[t].Text += string.Format("{0} 게임 : ", t+1);
                for (int i = 0; i < 6; i++) _display_game[t].Text += $"{game[i]} ";
            }
        }
        OnPropertyChanged("_display_game");
    }
    public RelayCommand game_create { get; set; }
}

и вопрос здесь. насколько я знаю, ViewModel является частью View. Итак, я переместился на страницу, элементы списка были обновлены (я имею в виду, что они исчезли). но я хочу сделать их живыми, что бы ни делал пользователь, кроме того, что пользователь нажимает свежую кнопку.

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

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

но я новичок в MVVM и часто боюсь, что нарушу правила MVVM. поэтому я отправляю этот вопрос.

Извините за длинный вопрос.

1 Ответ

0 голосов
/ 15 сентября 2018

Есть несколько способов сделать это, но сначала я расскажу вам, как вы уже знаете, чтобы вам было удобно.

Вы все еще можете передать список данных на следующую страницу какПараметр при переходе на следующую страницу.единственное отличие - раньше в коде , который вы использовали для отправки ** _display_game ** непосредственно в качестве параметра, теперь вам просто нужно отправить ViewModel._display_game в качестве параметра и оставшаяся логика на вашем OnNavigatedTo на следующей странице останется таким же, как и раньше, и на следующей странице вы можете получить этот параметр и даже установить

ViewModel.listofNextPage = e.Parameter as ObservableCollection<TextBlock> 

но это зависит от того, что вы хотите сделать на следующей странице.

Теперь я просто дам несколько подсказок о других возможных методах, чтобы вы знали свои варианты.

, которые вы можете использовать NavigationCacheMode свойство страницы на Обязательно и таким образом данные на этой странице будут сохранены, даже если вы перейдете на другие страницы и вернетесь.

Другой способ можетиспользовать Static Class в качестве службы, которая будет хранить сбор ваших данных.и эта коллекция также будет статической, так что вы сможете получить доступ к этой коллекции данных в любом месте вашего приложения.

Совет : не используйте TextBlock в качествевместо этого введите свою коллекцию, просто используйте строку, если вам нужно только 1 свойство, или создайте собственный класс, например, следующий:

class MyClass
{
    public string Text { get ; set ; }
}

, затем создайте коллекцию этого типа следующим образом:

public ObservableCollection<MyClass> _display_game { get; set; }

измените тип данных шаблона элемента:

<DataTemplate x:DataType="MyClass">

Поскольку TextBlock является элементом управления пользовательского интерфейса, поэтому лучше всего его использовать только для этой цели, а для привязки данных просто используйте обычные классы.

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