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 の [Create Data Binding] をクリックすると、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 に答える