设计平台上的示例数据,以及用于原型制作的示例数据

注释

 使用示例数据的必要性以及它能提供的帮助取决于您的绑定是使用 {Binding} 标记扩展 还是使用 {x:Bind} 标记扩展。 本主题中所述的技术基于使用 DataContext,因此这些技术仅适用于 {Binding}。 但是,如果使用 {x:Bind},则绑定至少在设计图面(甚至项目控件)上显示占位符值,因此你对示例数据的需求并不完全相同。

应用在 Microsoft Visual Studio 或 Blend for Visual Studio 的设计图面上显示实时数据可能是不可能或不可取的(可能是出于隐私或性能原因)。 为了让控件填充数据(以便你可以处理应用的布局、模板和其他视觉属性),可以通过多种方式使用设计时示例数据。 如果要构建草图(或原型)应用,示例数据也非常有用和节省时间。 可以在运行时使用草图或原型中的示例数据来说明想法,而无需连接到真实实时数据。

演示 {Binding} 的示例应用

注释

本文中的屏幕截图取自以前版本的 Visual Studio。 如果使用 Visual Studio 2019,则它们可能无法与开发体验完全匹配。

在标记中设置 DataContext

使用命令性代码(在代码隐藏中)将页面或用户控件 DataContext 设置为视图模型实例是相当常见的开发人员做法。

public MainPage()
{
    InitializeComponent();
    this.DataContext = new BookstoreViewModel();
}

但是,如果你这样做,你的页面就没有那么“可设计”了。 原因是,当 XAML 页面在 Visual Studio 或 Blend for Visual Studio 中打开时,分配 DataContext 值的操作性代码不会运行(事实上,任何后台代码都未被执行)。 XAML 工具当然会分析标记并实例化其中声明的任何对象,但它们实际上不会实例化页面的类型本身。 结果是,不会在控件或 “创建数据绑定” 对话框中看到任何数据,并且页面在样式和布局方面将更具挑战性。

稀疏设计 UI。

首先尝试的补救措施是将 DataContext 分配注释掉,并在页面标记中设置 DataContext。 这样,动态数据会在设计时和运行时同时显示出来。 为此,请先打开 XAML 页面。 然后,在 文档大纲 窗口中,单击根可设计元素(通常带有标签 [页面])将其选中。 在 属性 窗口中,找到 DataContext 属性(在 Common 类别内),并对其进行修改。 从 “选择对象”对话框中选择视图模型类型,然后单击“确定”

用于设置 DataContext 的 UI。

下面是生成的标记的外观。

<Page ... >
    <Page.DataContext>
        <local:BookstoreViewModel/>
    </Page.DataContext>

现在,您的绑定可以解析的设计界面如下所示。 请注意,“创建数据绑定”对话框中的“路径” 选取器现已填充,具体取决于 DataContext 类型和可以绑定到的属性。

可设计的 UI。

“创建数据绑定” 对话框只需要一个基础类型即可工作,但绑定需要用值来初始化属性。 如果不想在设计时联系云服务(由于性能、支付数据传输费用、隐私问题等),则初始化代码可以检查应用是否在设计工具(如 Visual Studio 或 Blend for Visual Studio)中运行,在这种情况下,加载示例数据仅在设计时使用。

if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
    // Load design-time books.
}
else
{
    // Load books from a cloud service.
}

如果需要将参数传递给初始化代码,可以使用视图模型定位符。 视图模型定位器是可以放入应用程序资源的类。 它有一个暴露视图模型的属性,你的页面的 DataContext 就绑定到该属性上。 定位器或视图模型可以使用的另一种模式是依赖注入,这是一种可以根据需要构建设计时或运行时数据提供程序的方法(每种提供程序都实现了一个通用接口)。

“类中的示例数据”和设计时属性

如果出于任何原因,上一部分中没有选项适合你,则仍可通过 XAML 工具功能和设计时属性提供大量的设计时数据选项。 一个不错的选择是在 Blend for Visual Studio 中使用 功能来创建示例数据。 可以在 数据 面板顶部的某个按钮上找到该命令。

只需指定要使用的命令的类。 然后,该命令会为你执行两项重要操作。 首先,它会生成一个 XAML 文件,其中包含用于递归地填充您选择的类及其所有成员实例的示例数据(实际上,该工具同样适用于 XAML 或 JSON 文件)。 其次,它会将您所选类的架构填充到 数据 面板中。 然后,可以将成员从 数据 面板拖到设计图面上,以执行各种任务。 根据拖放内容,可以向现有控件添加绑定(使用 {Binding}),或者创建新控件并同时为其添加绑定。 在任一情况下,如果尚未设置,该操作也会在页面的布局根目录为你设置一个设计时数据上下文(d:DataContext)。 该设计时数据上下文使用 d:DesignData 属性从生成的 XAML 文件中获取其示例数据(这样,就可以在项目中找到并编辑,使其包含所需的示例数据)。

<Page ...
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Grid ... d:DataContext="{d:DesignData /SampleData/RecordingViewModelSampleData.xaml}"/>
        <ListView ItemsSource="{Binding Recordings}" ... />
        ...
    </Grid>
</Page>

各种 xmlns 声明意味着具有 d: 前缀的属性仅在设计时解释,并在运行时被忽略。 因此,d:DataContext 属性仅在设计时影响 DataContext 属性的值;它在运行时不起作用。 甚至可以在标记中根据需要同时设置 d:DataContextDataContextd:DataContext 将在设计时重写,DataContext 将在运行时重写。 这些相同的替代规则适用于所有设计时和运行时属性。

d:DataContext 属性和其他所有设计时属性都记录在 Design-Time 属性 主题中,该主题仍对通用 Windows 平台(UWP)应用有效。

CollectionViewSource 没有 DataContext 属性,但它具有 Source 属性。 因此,可以使用 d:Source 属性在 CollectionViewSource上设置仅限设计时的示例数据。

    <Page.Resources>
        <CollectionViewSource x:Name="RecordingsCollection" Source="{Binding Recordings}"
            d:Source="{d:DesignData /SampleData/RecordingsSampleData.xaml}"/>
    </Page.Resources>

    ...

        <ListView ItemsSource="{Binding Source={StaticResource RecordingsCollection}}" ... />
    ...

为此,你将有一个名为 Recordings : ObservableCollection<Recording>的类,并且你将编辑示例数据 XAML 文件,使其仅包含 录制 对象(其中 录制 对象),如下所示。

<Quickstart:Recordings xmlns:Quickstart="using:Quickstart">
    <Quickstart:Recording ArtistName="Mollis massa" CompositionName="Cubilia metus"
        OneLineSummary="Morbi adipiscing sed" ReleaseDateTime="01/01/1800 15:53:17"/>
    <Quickstart:Recording ArtistName="Vulputate nunc" CompositionName="Parturient vestibulum"
        OneLineSummary="Dapibus praesent netus amet vestibulum" ReleaseDateTime="01/01/1800 15:53:17"/>
    <Quickstart:Recording ArtistName="Phasellus accumsan" CompositionName="Sit bibendum"
        OneLineSummary="Vestibulum egestas montes dictumst" ReleaseDateTime="01/01/1800 15:53:17"/>
</Quickstart:Recordings>

如果使用 JSON 示例数据文件而不是 XAML,则必须设置 Type 属性。

    d:Source="{d:DesignData /SampleData/RecordingsSampleData.json, Type=local:Recordings}"

到目前为止,我们一直在使用 d:DesignData 从 XAML 或 JSON 文件加载设计时示例数据。 另一种替代方法是 d:DesignInstance 标记扩展,它指示设计时源基于由 Type 属性指定的类。 下面是一个示例。

    <CollectionViewSource x:Name="RecordingsCollection" Source="{Binding Recordings}"
        d:Source="{d:DesignInstance Type=local:Recordings, IsDesignTimeCreatable=True}"/>

IsDesignTimeCreatable 属性指示设计工具应实际创建类的实例,这意味着该类具有公共默认构造函数,并且它使用数据(实际或示例)填充自身。 如果未 IsDesignTimeCreatable(或者将其设置为 False),则不会在设计界面上显示示例数据。 在这种情况下,所有设计工具都是分析类的可绑定属性,并在 数据 面板和 创建数据绑定 对话框中显示这些属性。

用于原型制作的示例数据

对于原型制作,需要在设计时和运行时提供示例数据。 对于该用例,Blend for Visual Studio 具有 新的示例数据 功能。 可以在 数据 面板顶部的某个按钮上找到该命令。

实际上,可以直接在 数据 面板中设计示例数据源的模式,而不是指定类。 还可以在 数据 面板中编辑示例数据值:无需打开和编辑文件(不过,如果愿意,仍然可以执行此操作)。

新的示例数据 功能使用 DataContext,而不是 d:DataContext,以便在运行草图或原型时以及设计示例数据时可用。 数据 面板确实加快了设计和绑定任务的速度。 例如,只需将集合属性从 数据 面板拖到设计图面上即可生成数据绑定项控件和必要的模板,所有模板都已准备好生成和运行。

用于原型制作的示例数据。