我多年来一直是XAML开发人员,但这个让我很难过。我一直睡得很厉害,所以也许我是在密集。
只是使用Windows应用商店应用程序,我注意到LayoutAwarePage最近有一个DefaultViewModel,这很好,但我只在运行时设置。实际上,我们需要在设计时建立一个DataContext来查看真实的假数据。
因此,在使用一些更复杂的ViewModel连接代码失败之后,我对此并不起作用:
public sealed partial class TemplatePage : LayoutAwarePage
{
public TemplatePage()
: base()
{
this.DefaultViewModel = new ObservableDictionary<string, object>();
this.DefaultViewModel.Add("Name", "Design-time value.");
this.InitializeComponent();
}
...}
VS2012和Blend都看不到DataContext。当我单击“为文本块创建数据绑定”时,“混合报告”
未设置数据上下文。您可以在选中自定义时输入路径。
这在运行时工作,我的复杂的智能屁股也可以,但不是在设计师。这一切都改变了吗?我错过了备忘录吗?
更新
所以使用Channel9教程中的指导
我至少现在能够包含更多不起作用的代码。
我已经创建了一些扩展BindableBase的类形式的假数据源,就像教程有这样的设置一样,但是事情的XAML方面很奇怪。
XAML在Page元素级别说,构造一个DesignTimeDataHub对象并将其用作DataContext。然后,在根网格级别,使用将DataContext重置为CommonFakeData属性。
Grid下TextBlock的Blend Create Data Binding对话框似乎认为DataContext是在Page级别设置的!
无论我使用{Binding CommonFakeData.Title}
还是{Binding Title}
,它都无效。
我显然搞砸了这一切。我很高兴他们更加努力,因为编写代码总是太容易了。
答案 0 :(得分:9)
好的,我已经破解了。设置DataContext的格式应为:
d:DataContext="{Binding PropertyNameOfSubViewModel, Source={d:DesignInstance Type=myNamespace:ViewModelTypeName, IsDesignTimeCreatable=True}}"
我现在将Page level DC作为DefaultViewModel。然后,我使用上面正确的DC设计时语法将另一个DC属性添加到布局根Grid元素。
TextBlock在其绑定中只需要SubViewModel上的属性名称。所以假数据视图模型是这样的粗糙:
public class DesignTimeDataHub : BindableBase // Probably doesn't need to be BindableBase.
{
public CommonBindableFakeData CommonFakeData { // get set }
}
public class CommonBindableFakeData : BindableBase
{
ctor { // set some default fake values }
public string Title { // get set }
}
这是它的样子: