我应该将我的数据放在哪里在MVVM中放置程序时不会被丢弃

时间:2018-09-15 09:33:18

标签: c# mvvm uwp

我对开发UWP和结构背后的代码有经验。
我是MVVM设计的新手,并且正在使用MVVM Basic模板开发UWP App。

我正在开发一个简单的App,它可以为乐透生成数字。为了帮助理解,我发布了我的App图片。
my App

我用带有主页的ViewModel来实现。下面是我的消息来源。

在Mainpage.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的一部分。因此,我浏览了页面,刷新了Listview项(我是说它们消失了)。但是我想使它们无论用户执行什么操作都可以存活,除了用户单击新鲜按钮之外。

即使页面不足并卷土重来,我也希望提供我的数据。而且我也想在另一页上使用此数据。

当我在后面编写代码时(我认为以前没有任何模式),我会将所有代码放在任何地方以实现我的目标。如果我想在另一个页面上使用该页面的数据,那么我只是将list作为参数传递给另一个页面的重载OnNavigated方法。

但是,我是MVVM的新手,所以我常常害怕自己违反MVVM规则。所以我发布了这个问题。

很抱歉,我想问很长时间。

1 个答案:

答案 0 :(得分:1)

您可以通过多种方式来做到这一点,但首先,我将告诉您您已经知道的方式,以便您满意。

  

导航到下一页时,仍可以将数据列表作为参数传递给下一页。唯一的区别是您之前直接发送** _display_game **作为参数的后面的代码中的之前,现在只需发送 ViewModel。 _display_game 作为参数,下一页上的 OnNavigatedTo 上的其余逻辑将与以前相同,在下一页上,您可以接收该参数甚至设置为

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

但这取决于您要在下一页上做什么。

现在,我将仅提供一些其他可能的方法的提示,以便您了解您的选择。

您可以使用页面的NavigationCacheMode属性为必需,这样即使您转到其他页面并返回,该页面上的数据也将保留。

另一种方法是使用静态类作为服务,该服务将保存您的数据收集。而且该集合也将是静态的,这样您就可以在应用程序中的任何位置访问该数据集合。

  

提示:请勿将 TextBlock 用作集合中的类型,而仅需要1个属性或创建如下自定义类的字符串即可:

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

然后按如下所示收集此类型:

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

更改itemtemplate的数据类型:

<DataTemplate x:DataType="MyClass">

因为TextBlock是一个UI控件,所以最好仅将其用于此目的,而对于数据绑定,只需使用常规类即可。