16

ViewModelのデータテンプレートをブレンド可能(Expression Blendで設計可能)にするにはどうすればよいですか?リソースに移動してDataTemplateを直接編集しようとすると、Drawingboradに表示されるのは空白の長方形だけです。これは、DataTemplateが何にもバインドされていないためです。もちろん、UserControlを作成し、そこにあるコードでデザインタイムデータを作成してテンプレートを表示することはできますが、リソース(編集用)とusercontrol(編集結果を表示するため)を切り替える必要があります。DataTemplateを編集して表示するためのより直接的な方法はありませんか?

4

2 に答える 2

25

使用するのは少し難しいですが、Blendには「デザイン時データ」と呼ばれる機能があります。最初は始めるのが難しいですが、一度やってみるととても簡単です。これにより、DataContextの優れたパターンも強制されます。

この件に関する適切なリンクは次のとおりです。http://www.robfe.com/2009/08/design-time-data-in-expression-blend-3/

ここにいくつかの選択肢の抜粋があります:

設計時のサイズについて

...設計時のプロパティは他のツールで安全に無視でき、実行時に無視されます(mc:Ignorableは、「d」プレフィックスが付いた名前空間を無視できることを指定します)。

 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 mc:Ignorable="d"

Expression Blendは、2つのデザイン時プロパティ(d:DesignWidth、d:DesignHeight)を使用して、デザイン時に使用されるコントロールのサイズを指定します。

設計時のデータソースについて

Blend 3で遊んでいたときに、d:Datacontextに出くわし、ウィンドウに「ライブデータソース」を追加しようとしました。DataContextを設定する古い方法と同じように動作すると思いましたが、アプリケーションを実行すると、データがありませんでした。..。

つまり、結果は次のようになります。次のようなコードを記述できます。

...
<Grid ...
      DataContext="{StaticResource GameDataSource}"
      d:DataContext="{StaticResource DesignTime_DateDataSource}">

これらの機能のファーストパーティサポートが必要な場合、これはBlend3用であることに注意してください。それらはかなり良いです-私はまだそれらの機能を調べていませんが、設計時データの設計者さえいます。

DataTemplatesへの適用

これは私が作り上げたものですが、うまくいくようです。ここでは、デザイン時データ機能を使用して、データをビジュアル要素のd:DataContextにプルしています。DataContextセットを必要とするすべてのトップレベル要素に対してこれを行う必要があります。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <!-- Resource dictionary entries should be defined here. -->
    <DataTemplate x:Key="MyTemplate">
        <TextBlock Text="{Binding Text}" d:DataContext="{StaticResource SampleDataSource}" />
    </DataTemplate>
</ResourceDictionary>

DataTypeが設定されたDataTemplateを使用している場合、バインディング構文はもう少し明確になりますが、それでも機能します。

<DataTemplate DataType="{x:Type vm:MyViewModel}" >
   <TextBlock Text="{Binding Text}" 
              d:DataContext="{Binding Source={StaticResource SampleDataSource}}" />
</DataTemplate>

この戦略により、DataTemplateを直接編集しながらどのように機能するかを確認できますが、実際にアプリを実行しない限り、そのDataTemplateを使用するビューで結果を確認することはできません。これは、モックを使用しているようには見えず、完全な置換オブジェクトを使用しているように見えるため、現時点ではBlendの制限です。ブレンドが「新しいデータソース->参照オブジェクトに基づく->MyCustomerObject」をクリックして新しい偽のデータソースを作成する機能を追加した場合は、ビジネスになります。

独自のプロパティトリックを添付することでこの制限を克服できる可能性はありますが、せいぜい難しいでしょう。

すべての状況で機能しますが、セットアップが少し面倒な代替手段は、実行時に偽のデータを実際のデータと交換するStaticResourcesを設定することですが、デザイナーでは静的なサンプルデータを表示します。

これらのテクニックのいくつかといくつかのビデオを含むKarlShifflettによる本当に素晴らしい記事があります:http: //karlshifflett.wordpress.com/2008/10/11/viewing-design-time-data-in-visual-studio -2008-cider-designer-in-wpf-and-silverlight-projects /

これがお役に立てば幸い、アンダーソン

于 2009-09-08T16:44:32.287 に答える
1

この戦略により、DataTemplateを直接編集しながらどのように機能するかを確認できますが、実際にアプリを実行しない限り、そのDataTemplateを使用するビューで結果を確認することはできません。これは、モックを使用しているようには見えず、完全な置換オブジェクトを使用しているように見えるため、現時点ではBlendの制限です。ブレンドが「新しいデータソース->参照オブジェクトに基づく->MyCustomerObject」をクリックして新しい偽のデータソースを作成する機能を追加した場合は、ビジネスになります。

実際のViewModelモックを使用したい場合は、実際のViewModelインスタンスを作成し、それらをd:DataContextで参照するのが最善の方法だと思います(たとえば、ObjectDataProviderまたはx:Staticを使用)

于 2009-09-18T12:57:54.113 に答える