web-dev-qa-db-ja.com

WPFのダミーのデザイン時データにはどのようなアプローチがありますか?

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

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

本当に欲しいのは、「ジョン」、「ポール」、「ジョージ」、「リンゴ」をItemsControlのスタイリング可能なアイテムとしてXAMLデザイナーに表示する機能です。アプリケーションの実行時にデータが表示されます。

また、Blendでは、実行時の条件でWPFによって事実上無視されるデザイン時バインディングデータを定義するいくつかの派手な属性を許可することも知っています。

だから私の質問は:

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

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

。データ統合XAMLデザインに使用できる式ブレンドの代替手段はありますか?(代替手段があることはわかっていますが、バインドされたサンプルデータなどを使用して表示できるものが特に必要ですか? )

95
el2iot2

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}}" ...
    

十分に機能します。

119
Goran

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

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

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

11

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

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

Laurent Bugnionには、Expression Blendに焦点を当てた同様のアプローチがあります。 VS2010ではmight動作しますが、まだ確認していません。

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

4
dthrasher

このアプローチを使用して、.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
Martin

Visual Studio 2010およびExpression Blend 4の新しいデザイン時機能がオプションになるかもしれません。

どのように機能するかは、BookLibraryWPF Application Framework( WAF)。 .NET4バージョンをダウンロードしてください。

4
jbe

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

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

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

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

3
joonas

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

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

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

1
Schneider