0

多年来,我一直是一名 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。当我单击为 TextBlock 创建数据绑定时,Blend 报告

未设置数据上下文。选中自定义时,您可以输入路径。

这在运行时有效,我复杂的聪明的东西也有效,但在设计器中无效。这一切的工作方式现在改变了吗?我错过了备忘录吗?

更新

因此,使用 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 方面很奇怪。

页面 XAML 和不准确的绑定对话框的截图

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

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

无论我使用{Binding CommonFakeData.Title}还是{Binding Title}不起作用。

我显然把这一切都搞砸了。我很高兴他们让这变得更加困难,因为编写代码总是太容易了。

4

1 回答 1

9

好的,我已经破解了。设置 DataContext 的格式应该是:

d:DataContext="{Binding PropertyNameOfSubViewModel, Source={d:DesignInstance Type=myNamespace:ViewModelTypeName, IsDesignTimeCreatable=True}}"

我现在将页面级 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 }
}

这是它的样子:

用于设计时绑定的工作 XAML

于 2013-01-11T14:34:51.117 回答