Windows应用商店App设计时DataContext

时间:2013-01-11 10:13:12

标签: winrt-xaml windows-store-apps

我多年来一直是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教程中的指导

http://channel9.msdn.com/Series/Windows-Store-apps-for-Absolute-Beginners-with-C-/Part-8-Understanding-how-Data-Binding-Works-at-Design-Time

我至少现在能够包含更多不起作用的代码。

我已经创建了一些扩展BindableBase的类形式的假数据源,就像教程有这样的设置一样,但是事情的XAML方面很奇怪。

Shot of page XAML and inaccurate Binding dialog

XAML在Page元素级别说,构造一个DesignTimeDataHub对象并将其用作DataContext。然后,在根网格级别,使用将DataContext重置为CommonFakeData属性。

Grid下TextBlock的Blend Create Data Binding对话框似乎认为DataContext是在Page级别设置的!

无论我使用{Binding CommonFakeData.Title}还是{Binding Title},它都无效。

我显然搞砸了这一切。我很高兴他们更加努力,因为编写代码总是太容易了。

1 个答案:

答案 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 }
}

这是它的样子:

Working XAML for design time binding