WPFでダミーの設計時データに利用できるアプローチは何ですか?


97

式のブレンドなしで、vs2010でXAMLエディターを使用しています。これは賢明なことですが、デザイン時のデータバインディングの必要性がますます高まっています。単純なケースでは、FallbackValueプロパティは非常にうまく機能します(TextboxesやTextBlocksなど)。ただし、特にItemsControl処理などを行う場合は、実行可能ファイルを実行せずにコントロールとデータテンプレートを調整および調整できるように、デザイナーにサンプルデータを表示する必要があります。

ObjectDataProvider型にバインドできるため、視覚化のための設計時データを提供できることはわかっていますが、両方の設計時のロードをロードすることにより、リソースを無駄にすることなく、実際の実行時データをバインドできるようにするためのジャグリングがあります。ダミーデータとランタイムバインディング。

私が本当に望んでいるのは、たとえば、「John」、「Paul」、「George」、「Ringo」をXAMLデザイナーでのスタイル可能なアイテムとしてItemsControl表示する機能ですが、アプリケーションの実行時に実際のデータが表示されます。実行します。

また、Blendでは、実行時の条件でWPFによって効果的に無視される設計時バインディングデータを定義するいくつかの豪華な属性が許可されていることも知っています。

だから私の質問は:

1. Visual Studio XAMLデザイナーでコレクションと重要なデータのデザイン時バインディングを活用し、ランタイムバインディングにスムーズにスワップするにはどうすればよいですか?

2.この設計時データと実行時データの問題を他の人はどのように解決しましたか?私の場合、両方に同じデータを非常に簡単に使用することはできません(たとえば、データベースクエリで使用できるように)。

3.データ統合XAML設計に使用できる式ブレンドの代替はありますか?(私はいくつかの選択肢があることを知っていますが、具体的に私が使用してバインドされたサンプルデータなどを見ることができるものを望んでいますか?)

回答:


120

VS2010を使用すると、デザインタイム属性を使用できます(SLとWPFの両方で機能します)。とにかく私は通常、モックデータソースを持っているので、それはただの問題です:

  • 名前空間宣言を追加する

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  • モックデータコンテキストをウィンドウ/コントロールリソースに追加する

    <UserControl.Resources>
      <ViewModels:MockXViewModel x:Key="DesignViewModel"/>
    </UserControl.Resources>
    
  • 設計時データコンテキストの設定

    <Grid d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ...

十分に機能します。


2
あなたが使用して問題がある場合d:DataContext、あなたは、この問題のいくつかの助けを見つけることがあります。stackoverflow.com/questions/8303803/...
マーティンLiversage

27
この例では、MockXViewModelのインスタンスがリリースビルドのリソースに読み込まれませんか?これは問題ではありませんか?
jpierson 2012年

12
参考:次も必要です。そうしないと、VS2012コンパイラはxamlファイルをコンパイルしません。 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"およびmc:Ignorable="d"
Orion Edwards

51
jpiersonは正しいです。使用したい<Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...です。このようにして、モックされたビューモデルはデザイナーでのみ作成され、アプリケーションの実行中には作成されません。このアプローチでは、モックビューモデルにパラメーターのないコンストラクターが必要であることを覚えておいてください。しかし、同じことが上記の回答の例にも当てはまります。
2013年

2
@ルネあなたのアプローチははるかに優れています。回答として追加してください。投票します
dss539 '31

15

ゴランの受け入れられた答えとルネの優れたコメントの融合として。

  • 名前空間宣言を追加します。 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  • コードから設計時データコンテキストを参照します。
    <Grid d:DataContext="{d:DesignInstance Type=ViewModels:MockXViewModel, IsDesignTimeCreatable=True}" ...


1
私はこれを新しい答えとしてマークしたくなりますが、おそらく残りの詳細を引き出すことができます。
el2iot2 2017年

これはより多くの可視性を必要とするか、受け入れられた答えに引き込まれる必要があります。それははるかに優れたソリューションです。
Lauraducky 2017

なぜこれが良いのですか?最初は、受け入れられた答えは実行時にもモックモデルを不必要に生成すると考えていましたが、実際にはテストしていません。使用しない場合、リソースは作成されません。
ポール

@Paulそれは本当に好みの問題ですが、この答えは、設計時のデータコンテキスト全体を1つの宣言で保持するのではなく、2つの場所で保持します。変更が容易になります
John Stritenberger

1
@JohnStritenbergerその好みだけでなく、受け入れられた回答は、デザイナーだけでなく、いつでも不必要にリソースをメモリにロードします。
UuDdLrLrSs

4

Karl Shifflettは、VS2008とVS2010で同じよ​​うに機能するはずのアプローチについて説明しています。

WPFおよびSilverlightプロジェクトのVisual Studio 2008 Cider Designerで設計時データを表示する

Laurent Bugnionには、Expression Blendに焦点を当てた同様のアプローチがあります。それは可能性がある VS2010のために働くが、私はこれをまだ確認していません。

Microsoft Expression Blendのデザインモードでのデータのシミュレーション


これを私の注意を喚起してくれてありがとう。DesignAndRunTimeDataContextのコンセプトが気に入っています。
el2iot2 2010年

1
Karl ShifflettがVisual Studio 2010:WPFとSilverlight Designerのサンプルデータ
totorocat

1
リンクコンテンツの要点は、特に最初のリンクが無効になっているため、実際に回答に編集する必要があります。
Lauraducky

4

多分、Visual Studio 2010とExpression Blend 4の新しいデザイン時機能は、あなたのためのオプションです。

その動作は、WPFアプリケーションフレームワーク(WAF)BookLibraryサンプルアプリケーションに示されています。.NET4バージョンをダウンロードしてください。


リンクをありがとう。アプローチを見るために私が見なければならない特定のコードファイルまたは構造はありますか?(簡単な概要がいいでしょう)
el2iot2

BookLibrary.Presentationプロジェクトをご覧ください。このプロジェクトには、「Views」フォルダー内のUserControlsによって使用される「DesignData」フォルダーがあります。
jbe

1
+1。ちょうどこれを見た。サンプルデータビューモデルがXAMLで宣言され、d:DataContext = "{d:DesignData Source = .. / DesignData / SampleLendToViewModel.xaml}"を介して参照されることに関心のある人のために
RichardOD

4

私は.NET 4.5とVisual Studio 2013で設計時データを生成するためにこのアプローチを使用しています。

ViewModelが1つだけあります。ビューモデルには、IsInDesignModeデザインモードがアクティブかどうかを示すプロパティがあります(クラスを参照ViewModelBase)。次に、ビューモデルコンストラクターでデザインタイムデータ(アイテムコントロールへの入力など)を設定できます。

さらに、ビューモデルコンストラクターに実際のデータをロードしません。これにより、実行時に問題が発生する可能性がありますが、設計時のデータの設定は問題になりません。

public abstract class ViewModelBase
{
    public bool IsInDesignMode
    {
        get
        {
            return DesignerProperties.GetIsInDesignMode(new DependencyObject());
        }
    }
}

public class ExampleViewModel : ViewModelBase
{
    public ExampleViewModel()
    {
        if (IsInDesignMode == true)
        {
            LoadDesignTimeData();
        }
    }

    private void LoadDesignTimeData()
    {
        // Load design time data here
    }       
}

4

Visual Studio 2017を使用して、私はこのようなすべてのガイドと質問に従うようにしてき<ItemsControl>ましたが、DesignFooViewModelから継承するaのコンストラクター内にあるコードを実行しないaにまだ直面していましたFooViewModel。この「便利な」MSDNガイド(ネタバレ:MessageBoxデバッグ)に続く「実行されなかった」部分を確認しました。これは元の質問とは直接関係ありませんが、他の人の時間を大幅に節約できることを願っています。

私は何も悪いことをしていないことがわかりました。問題は、アプリケーションをx64用にビルドする必要があることでした。Visual Studioは2018年、まだ32ビットプロセスであるデザイナーの一部に64ビットのホストプロセスを回すことができない明らかにし、それは私のx64のクラスを使用することはできません。本当に悪いのは、考えられるログにエラーが見つからないことです。

したがって、デザインタイムビューモデルで偽のデータが表示されているためにこの質問に出くわした場合(たとえば、プロパティを設定しても<TextBlock Text="{Binding Name}"/>表示さNameれる)、原因はおそらくx64ビルドです。依存関係が原因でビルド構成をanycpuまたはx86に変更できない場合は、完全にanycpuであり、依存関係(または依存関係)がない新しいプロジェクトを作成することを検討してください。したがって、コードの初期化部分を除くほとんどまたはすべてを「WPFアプリ」プロジェクトから「C#クラスライブラリ」プロジェクトに分割することになります。

私が取り組んでいるコードベースについては、これはおそらく正味の正のことであるいくつかのコードの複製を犠牲にして懸念の健全な分離を強制すると思います。


3

最高評価の回答に似ていますが、私の意見ではより優れています。静的プロパティを作成して、設計データのインスタンスを返し、次のようにXAMLから直接参照できます。

<d:UserControl.DataContext>
    <Binding Source="{x:Static designTimeNamespace:DesignTimeViewModels.MyViewModel}" />
</d:UserControl.DataContext>

これにより、を使用する必要がなくなりますUserControl.Resources。静的プロパティは、重要なデータ型を構築できるファクトリとして機能できます。たとえば、デフォルトのctorがない場合は、ここでファクトリまたはコンテナを呼び出して、適切な依存関係を挿入できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.