【问题标题】:Windows Store App Design-time DataContextWindows 应用商店应用程序设计时数据上下文
【发布时间】:2013-01-11 10:13:12
【问题描述】:

多年来,我一直是一名 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 表示,在页面元素级别,构造一个 DesignTimeDataHub 对象并将其用作 DataContext。然后,在根 Grid 级别,使用将 DataContext 重置为 CommonFakeData 属性。

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

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

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

【问题讨论】:

  • 您可以缩放浏览器以查看该图像。

标签: winrt-xaml windows-store-apps


【解决方案1】:

好的,我已经破解了。设置 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 }
}

它是这样的:

【讨论】:

  • 谢谢!对于其他人,这是使用简单对象的方法.. d:DataContext="{Binding Source={d:DesignInstance Type=objects:Item, IsDesignTimeCreatable=True}}"
猜你喜欢
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多