2009-09-19 4 views
15

Ich habe ein Datamaplate für ein Ansichtsmodell, in dem ein Elementsteuerelement an eine CollectionViewSource gebunden ist (um die Sortierung in XAML zu ermöglichen).DesignTime-Daten werden nicht in Blend angezeigt, wenn sie an CollectionViewSource gebunden sind

<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> 

Ich habe auch Setup die Usercontrol, wo all dies definiert ist Entwurfsdaten liefern

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

Dies ist im Grunde eine statische Eigenschaft, die mir eine EquipmentViewModel gibt, die eine Liste von ModuleViewModels (Equipment verfügt. Module). Nun, solange ich an die Collection bindet die Entwurfszeit-Daten zeigen, nicht in Mischung bis 3. Wenn ich an die Ansichtsmodell Sammlung binden direkt

<ItemsControl ItemsSource="{Binding Modules}" 

ich die Entwurfsdaten sehen. Irgendeine Idee, was ich tun könnte?

+2

Haben das gleiche Problem genau. Die Bindung an eine List--Eigenschaft ist in Ordnung, aber sobald ich an eine CollectionView gebunden bin, die an diese Eigenschaft gebunden ist, verschwinden alle Daten. –

Antwort

7

dort getan, dass (jetzt zumindest) :)

Dies ist die Lösung, die ich gefunden habe. Der Trick besteht darin, die Quelle für die CollectionViewSource-Entwurfszeit zu überschreiben. Ich verwende die d:DesignSource Eigenschaft eines andere statische Ressource Designzeit zu verwenden:

<Window.Resource> 
    <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> 
0
  1. Ich bin nicht sicher, x:Static soll in d:DataContext arbeiten, ich denke nur d: DesignInstance oder d:DesignData konnte.
  2. Haben Sie die Entwurfszeitdaten getestet und sicher, dass tatsächlich mit Daten gefüllt?
  3. Versuchen Sie, die d:IsDesignTimeCreatable=True Eigenschaft in der d:DesignInstance anzugeben.
  4. Obwohl this Silverlight spezifisch ist, bin ich sicher, dass es Ihnen vielleicht einen Hinweis geben könnte.

Es sollte in der Regel wie folgt aussehen:

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

Sie die gleiche Ansichtsmodell sowohl für Laufzeit und Entwurfszeit verwenden könnte, machen Sie eine IsInDesignTime Eigenschaft in Ihnen ViewModelBase und Daten zurückgeben entsprechend.
Beispiel:

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; 
    } 
} 

Anmerkung: Ich möchte Sie ermutigen, StaticResources zu verwenden (statt DynamicResources) für Vorlagen oder Stile, die nicht dazu gedacht sind, zur Laufzeit zu ändern. Lesen Sie this für weitere Informationen.

0

nicht sicher, ob dies noch relevant ist ... vor kurzem hatte ein ähnliches Problem - ich bin immer noch irgendwo auf der WPF Lernkurve, nur nicht ganz sicher, wo ...

Wie auch immer, hier ist das Szenario: Ich würde ein Objekt des Typs ObservableCollection irgendwo in meinem lokalen Namespace (um die Dinge einfach zu halten), zum Beispiel ..

public class NodesCollection : ObservableCollection<Nodes> { }

dann von Blend/XAML, kann ich leicht "Create Object Data Source" (von Data-Tools-Panel) und finden NodesCollection dargestellt und ausgewählt werden können.

Als nächstes Mischung wird eine lokale Ressource in der Nähe der Spitze der XAML-Datei, ähnlich zu erstellen:

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

Mit diesem können Sie leicht binden die ItemsSource Eigenschaft eines listbox zur Datenquelle haben wir gerade erstellt. Klicken Sie beispielsweise im Werkzeugfenster "Objekte und Zeitachsen" mit der rechten Maustaste auf Ihr Listenfeld, und wählen Sie "Datenbindung von Datenquellen an Daten". Im Popup-Dialogfeld können Sie leicht sehen, dass NodesCollectionDataSource verfügbar ist und verwendet werden kann.

Doch hier kommt die Fragen, die ich lösen musste ...

In einigen Bücher zur Zeit lese ich, sie sprechen über eine Collection in XAML erstellen, die für die Sortierung/Gruppierung verwendet werden kann/Filtern/Navigieren der zugrunde liegenden Datenquelle.

Erste Ausgabe, ich kann CollectionViewSource nirgends in Blend finden; Die einzige Möglichkeit besteht darin, das Tag in Xaml manuell zu erstellen.

Geben Sie einfach <CollectionViewSource x:Key="cvsNodes" /> in den Ressourcenblock (Xaml) ein, und von dort aus können Sie weitere Eigenschaften mithilfe der Blend-GUI ändern. B. die zugrunde liegende Source-Eigenschaft und zusätzliche Sortier- und Gruppendeskriptoren (im Ressourcenwerkzeug-Bedienfeld).

Jetzt kommt der Teil, wo wir die List-Box die Itemssource-Eigenschaft auf die Collection binden möchten. Sie können dieses Element jedoch nicht mit der Blend-GUI finden. Daher müssen Sie den Bindungswert manuell eingeben. Zum Beispiel:

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

Dies funktioniert. Aber um es noch einfacher, müssen wir in XAML zur ursprünglichen Collectionressourcenelement zurück gehen und fügen Sie ein zusätzliches Attribut:

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

Die d:IsDataSource="True" funktioniert der Trick des Habens erkennen Mischung GUI diese Ressource als verfügbar verwendet werden.

Jetzt, wenn wir zurück zu der ItemsSource -Eigenschaft der ListBox aus dem Eigenschaften-Werkzeugfenster gehen, sollten wir in der Lage sein, cvsNodes aus der Liste der verfügbaren Datenquellen auszuwählen.

Ich hoffe, das jemand hilft, die wie ich zu dem gleichen Schluss gekommen sein, die das Blend ist und die zugrunde liegende Technologie XAML nicht vollständig synchronisiert sind; und dass Blend im besten Fall ein Werkzeug zum Erzeugen des Xaml ist, kein Ersatz für das Erlernen der Xaml-Sprache.

+0

Auch nur um die ursprüngliche Frage zu beantworten; Ja. Dadurch kann Blend während der Entwicklung Beispieldaten anzeigen. Sie müssen lediglich einige Beispieldaten im Konstruktor Ihrer ObjectCollection-Klasse auffüllen - in meinem Fall wäre dies der ctor to NodesCollection – klee

Verwandte Themen