我对开发UWP和结构背后的代码有经验。
我是MVVM设计的新手,并且正在使用MVVM Basic模板开发UWP App。
我正在开发一个简单的App,它可以为乐透生成数字。为了帮助理解,我发布了我的App图片。
我用带有主页的ViewModel来实现。下面是我的消息来源。
<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}"/>
public sealed partial class MainPage : Page
{
public MainViewModel ViewModel { get; } = new MainViewModel();
public MainPage()
{
DataContext = ViewModel;
InitializeComponent();
}
}
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规则。所以我发布了这个问题。
很抱歉,我想问很长时间。
答案 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控件,所以最好仅将其用于此目的,而对于数据绑定,只需使用常规类即可。