我一直在Windows Phone应用程序中使用DesignData,我希望用它来帮助在VS2012 / Blend for VS中的Metro风格应用程序中可视化设计。
我已经尝试过希望显而易见的事了:
<common:LayoutAwarePage
x:Name="pageRoot"
x:Class="MyRootNamespace.Views.EventView"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
IsTabStop="false"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyRootNamespace.Views"
xmlns:common="using:MyRootNamespace.Common"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:bm="using:Bing.Maps"
d:DataContext="{d:DesignData Source=../SampleData/SpecialEventSampleData.xaml}"
mc:Ignorable="d">
使用SpecialEventSampleData.xaml看起来像:
<local:SpecialEvent
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyRootNamespace.ViewModels"
EventName="Foo Fighters"
Description="This exclusive April Fools Gig will see Dave Grohl and the rest of the Foo Fighters rock out at this exclusive made up gig"
VenueName="Village Hall"
/>
它引用的类有一个公共的无参数构造函数,但Visual Studio发出错误:
错误无法创建“SpecialEvent”的实例。 C:... \ MyRootNamespace.Windows \的sampleData \ SpecialEventSampleData.xaml
此外,我原本期望将构建操作设置为“DesignData”或类似,但这似乎不是Visual Studio 2012中的一个选项?
我需要做些什么才能让design time data在VS2012 / Blend中工作?
答案 0 :(得分:4)
SpecialEvent是您的ViewModel吗?如果是这样,你可以在你的XAML中做这样的事情(直接在你的常见之后:LayoutAwarePage开放声明)?
<d:Page.DataContext>
<local:SpecialEvent>
</d:Page.DataContext>
然后从您的公共区域删除此行:LayoutAwarePage:
d:DataContext="{d:DesignData Source=../SampleData/SpecialEventSampleData.xaml}"
我有类似的代码正在运行。
答案 1 :(得分:1)
在Windows Phone中(我相信),示例数据文件的路径是相对于应用程序根目录的。在Windows 8中,示例数据文件的路径是相对于要在其中使用的页面xaml文件。
在上面的示例中, page.xaml 文件需要位于项目的子文件夹中,但位于与 SampleData 不同的文件夹中。
Windows 8示例数据不会自动为您创建集合实例。所以,如果你有这样的样本数据:
<Event>
<Attendees>
<Attendee Name="Joe" />
</Attendees>
</Event>
在定义变量时,您需要确保参加者属性的支持字段设置为新的集合实例。如果您使用自动属性(参加者{get; set;} 语法),则需要在构造函数中将属性设置为新的集合实例,然后才能在xaml中添加项目。
最终,Windows 8 xaml无法处理泛型类型。因此,如果您的参加者属性类型为 Collection&lt; Attendee&gt; ,您将无法在xaml中创建它的实例。
您始终可以创建一个名为 AttendeeCollection 的简单类,该类继承自 Collection&lt; Attendee&gt; ,并在您的xaml中创建该实例。
希望有所帮助。
答案 2 :(得分:0)
尝试使用xaml文件的完整路径而不是相对路径。
答案 3 :(得分:0)
这一点模糊不清,但归结为我在View-Model上INotifyPropertyChanged
的实现。
在我的Windows Phone代码中,我需要付出少量努力,以确保后台工作线程引发的事件在UI线程中弹出:
protected delegate void OnUIThreadDelegate();
protected void OnUIThread(OnUIThreadDelegate onUIThreadDelegate)
{
if (Deployment.Current.Dispatcher.CheckAccess())
{
onUIThreadDelegate();
}
else
{
Deployment.Current.Dispatcher.BeginInvoke(onUIThreadDelegate);
}
}
然后使用:
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
OnUIThread(() =>
{
base.OnPropertyChanged(e);
});
}
似乎在移植该代码时,我没有检查导致异常的CoreWindow.GetForCurrentThread()
的结果在代码的最深处深处触发,因为设计者在我的类型上设置了属性,而我正在努力提高事件并且可怕地死去。我的坏。