如何在 UWP Windows 10 中调试数据服务生成的测试数据
本文关键字:服务生 数据 测试数据 调试 UWP Windows | 更新日期: 2023-09-27 18:33:45
我有UWP应用程序,它使用MVVMLight和一个数据服务,它注入到我的ViewModel的构造函数中,数据服务在运行时工作正常。它从 Web 服务中提取数据,但是当我尝试构建一些测试数据时,我无法让它工作,以便我可以在 IDE 中以调试模式使用 UI。
这是我正在使用的:
视图模型定位器:
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IDataService,
Design.DesignDataService>();
}
else
{
SimpleIoc.Default.Register<IDataService>(() => new DataService());
}
设计数据服务:
public class DesignDataService : IDataService
{
public bool IsConnectedToInternet
{
get
{
return true;
}
}
public Task<T> DownloadDataAsync<T>(string url)
{
switch (url)
{
case Urls.Data1Url:
return Task.FromResult<T>(GetData1<T>());
default:
return Task.FromResult<T>(default(T));
}
}
}
private T GetData1<T>()
{
ObservableCollection<Data1Model> items = new
ObservableCollection<Data1Model>();
items.Add(new Data1Model(){Name="Test1"});
items.Add(new Data1Model(){Name="Test2"});
return (T) Convert.ChangeType(items, typeof(T));
}
数据1页视图模型:
this.TemporaryItems = new ObservableCollection<Data1Model>();
this.Items = this.Items ?? (this.Items = new
ObservableCollection<Data1Model>());
this.Items.Clear();
if (this.IsInDesignMode)
{
this.TemporaryItems =
this.DataService.DownloadDataAsync<ObservableCollection<Data1Model>>
(Urls.Data1Url).Result;
foreach (Data1Model tempItem in this.TemporaryItems)
{
this.Items.Add(tempItem);
}
}
else
{
//deal with live data
}
XAML:
<Page x:Class="MyApp.Views.NowNextPage"
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"
xmlns:local="using:MyApp.Views"
xmlns:converters="using:MyApp.Converters"
xmlns:usercontrols="using:MyApp.UserControls"
mc:Ignorable="d"
DataContext="{Binding Source={StaticResource Locator},
Path=Data1PageViewModel}"
SizeChanged="Page_SizeChanged"
Loaded="Page_Loaded" >
<Grid Background="White">
<ListView x:Name ="lvwData1"
ItemsSource="{Binding Items}"
Background="White"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
SelectedIndex="{Binding SelectedNowNextIndex, Mode=TwoWay}"
SelectedItem="{Binding SelectedNowNextItem, Mode=TwoWay}"
SelectionMode="None"
ItemContainerStyle="{StaticResource ListViewItemStyle}">
<ListView.ItemTemplate>
<DataTemplate>
<usercontrols:Data1UserControl />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<usercontrols:ProgressControl Visibility="{Binding IsLoadingData, Converter={StaticResource BoolToVisibilityConverter}}"
IsDataLoading="{Binding IsLoadingData}"
ProgressMessage="{Binding ProgressMessage}" >
</usercontrols:ProgressControl>
</Grid>
为了这个问题,我简化了测试数据的创建,希望我没有弄乱任何名称,但如果有,请忽略我的代码,这些绝对是正确的。请记住,这在运行时按预期工作。
我尝试通过在 IsInDesignMode 条件下直接调用静态函数来摆脱对"调试数据服务"的调用:
foreach (Data1Model tempItem in Design.GetData1List())
{
this.Items.Add(tempItem);
}
但是在设计模式下它仍然不会显示我的数据。
我读过这篇非常好的文章:
Windows 10 开发:使用 Blend 添加设计时数据
虽然我没有像文章中那样 100% 地这样做,但它非常相似,但我一定错过了一些东西!
知道为什么我的ListView
在 IDE 中不显示任何项目吗?
我可以做任何测试来检查"IsInDesignMode"部分是否真的被调用?
如果你想在设计模式下获取数据,你的 Web 服务前面 我认为这是不可能的,您需要创建一个模拟视图模型,以使用假数据填充设计模式下的所有数据。
此方法是在设计模式下查看所有数据的最简单方法。
如果您不想创建模拟视图模型,则可以创建一个模拟服务来获取所有用于测试目的的虚假数据。
通常,我在 ViewModel 的构造函数中调用所有方法来获取设计模式下的假数据,并且效果很好。我正在一个小例子中展示这种方法,我将在我的存储库中分享它。