15

itemscontrolがCollectionViewSourceに対してバインドされているビューモデルのデータテンプレートがあります(xamlでの並べ替えを有効にするため)。

<DataTemplate x:Key="equipmentDataTemplate">
    <Viewbox>
        <Viewbox.Resources>
            <CollectionViewSource x:Key="viewSource" Source="{Binding Modules}">
                <CollectionViewSource.SortDescriptions>
                    <scm:SortDescription PropertyName="ID" Direction="Ascending"/>
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
        </Viewbox.Resources>
        <ItemsControl ItemsSource="{Binding Source={StaticResource viewSource}}" 
                      Height="{DynamicResource equipmentHeight}" 
                      ItemTemplate="{StaticResource moduleDataTemplate}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Viewbox>
</DataTemplate>

また、設計時データを提供するためにこれらすべてが定義されているUserControlをセットアップしました

d:DataContext="{x:Static vm:DesignTimeHelper.Equipment}">

これは基本的に、ModuleViewModels(Equipment.Modules)のリストを持つEquipmentViewModelを提供する静的プロパティです。これで、CollectionViewSourceにバインドしている限り、デザインタイムデータはブレンド3に表示されません。ViewModelコレクションに直接バインドすると

<ItemsControl ItemsSource="{Binding Modules}"

デザインタイムのデータを見ることができます。私に何ができるか考えてみませんか?

4

3 に答える 3

7

そこに行ったことがある(少なくとも今は):)

これは私が見つけた解決策です。秘訣は、CollectionViewSourceデザインタイムのソースをオーバーライドすることです。プロパティを使用して、d:DesignSource別の静的リソースの設計時間を使用します。

<Window.Resources>
    <CollectionViewSource x:Key="ViewSource"
            Source="{Binding ModelProperty}"
            d:DesignSource="{{x:Static MyProg:DesignTimeData.MyList}">
        <!-- Contents -->
    </CollectionViewSource>
</Window.Resources>
    
<!-- No change to the using class -->
<ListBox ItemsSource="{Binding Source={StaticResource ViewSource}}">
        
</ListBox>
于 2011-04-21T09:17:22.677 に答える
0
  1. で動作するかどうかはわかりませんx:Staticが、d:DesignInstanceでのみ動作するd:DataContextと思いますd:DesignData
  2. 設計時のデータをテストし、実際にデータで満たされていることを確認しましたか?
  3. d:IsDesignTimeCreatable=Trueでプロパティを指定してみてくださいd:DesignInstance
  4. これはSilverlight固有ですがヒントが得られると確信しています。

一般的には次のようになります。

d:DataContext="{d:DesignInstance Type=vm:EquipmentViewModel, IsDesignTimeCreatable=True}"

実行時と設計時の両方に同じViewModelを使用し、IsInDesignTimeプロパティを作成してViewModelBaseデータを適切に返すことができます。
例:

private static bool? _isInDesignMode;
public static bool IsInDesignModeStatic
{
    get
    {
        if (!_isInDesignMode.HasValue)
        {
            var prop = DesignerProperties.IsInDesignModeProperty;
            _isInDesignMode
                = (bool)DependencyPropertyDescriptor
                .FromProperty(prop, typeof(FrameworkElement))
                .Metadata.DefaultValue;
        }

        return _isInDesignMode.Value;
    }
}

注:実行時に変更することを意図していないテンプレートまたはスタイルには、StaticResources(ではなく)を使用することをお勧めします。詳細については、これDynamicResourcesをお読みください。

于 2011-03-18T03:50:59.007 に答える
0

これがまだ関連しているかどうかはわかりません...最近同様の問題が発生しました-私はまだWPFの学習曲線のどこかにいますが、どこにあるのかよくわかりません...

とにかく、シナリオは次のとおりです。たとえば、ローカル名前空間のどこかにObservableCollection型のオブジェクトを作成します(簡単にするため)。

public class NodesCollection : ObservableCollection<Nodes> { }

次に、Blend / Xamlから、(データツールパネルから)簡単に「オブジェクトデータソースの作成」を行うことができ、検索NodesCollectionが表示されて選択できます。

次に、Blendは、次のように、Xamlファイルの先頭近くにローカルリソースを作成します。

<local:NodesCollection x:Key="NodesCollectionDataSource" d:IsDataSource="True" />

ItemsSourceこれにより、リストボックスのプロパティを作成したばかりのデータソースに簡単にバインドできます。たとえば、[オブジェクトとタイムライン]ツールパネルからリストボックスを右クリックし、[ItemsSourceをデータにデータバインド]を選択します。ポップアップダイアログボックスで、NodesCollectionDataSource利用可能で使用できることが簡単にわかります。

しかし、ここに私が解決しなければならなかった問題があります...

私が現在読んでいるいくつかの本では、XamlでCollectionViewSourceを作成することについて説明しています。これは、基になるデータソースの並べ替え/グループ化/フィルタリング/ナビゲートに使用できます。

最初の問題は、BlendのどこにもCollectionViewSourceが見つかりません。したがって、唯一のオプションは、Xamlでタグを手動で作成することです。

Resourcesブロック(Xaml)内に入力するだけ<CollectionViewSource x:Key="cvsNodes" />で、そこからBlendGUIを使用して追加のプロパティを変更できます。たとえば、基になるSourceプロパティと、追加の並べ替えおよびグループ記述子([リソース]ツールパネルの下にあります)を設定します。

次に、ListBoxのItemsSourceプロパティをCollectionViewSourceにバインドする部分があります。ただし、BlendGUIを使用してそのアイテムを見つけることはできません。したがって、バインディング値を手動で入力する必要があります。例えば:

<ListBox x:Name=.. ItemsSource="{Binding Source={DynamicResource cvsNodes}}".. />

これは機能します。ただし、さらに簡単にするには、Xamlの元のCollectionViewSourceリソース要素に戻り、属性を追加する必要があります。

<CollectionViewSource x:Key="cvsNodes" Source=... d:IsDataSource="True"

Blend GUIにそのd:IsDataSource="True"リソースを使用可能として認識させるというトリックはありませんか?

ここで、プロパティツールパネルからListBoxのItemsSourceプロパティに戻ると、cvsNodes使用可能なデータソースのリストから選択できるはずです。

これが、Blendと基盤となるXamlテクノロジーが完全に同期されていないという、私と同じ結論に達した可能性のある人に役立つことを願っています。そのBlendは、せいぜいXamlを生成するためのツールであり、Xaml言語を学習するための代替手段ではありません。

于 2013-04-10T03:01:32.860 に答える