2009-09-19 12 views
15

Ho un datatemplate per un viewmodel in cui un controllo items è associato a un oggetto CollectionViewSource (per abilitare l'ordinamento in xaml).I dati DesignTime non vengono visualizzati in Blend quando sono associati a CollectionViewSource

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

Ho anche impostare l'UserControl in cui tutto questo viene definito di fornire i dati designtime

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

questo è fondamentalmente una proprietà statica che mi dà un EquipmentViewModel che ha una lista di ModuleViewModels (attrezzature. moduli). Ora il tempo che mi legano alla CollectionViewSource i dati designtime non si presenta in miscela 3. Quando mi legano alla raccolta ViewModel direttamente

<ItemsControl ItemsSource="{Binding Modules}" 

posso vedere i dati designtime. Qualche idea su cosa potrei fare?

+2

Hanno esattamente lo stesso problema. Il binding con una proprietà è valida, ma non appena eseguo il binding a un CollectionView associato a tale proprietà, tutti i dati scompaiono. –

risposta

7

stato lì fatto che (ora almeno) :)

Questa è la soluzione che ho trovato. Il trucco è sovrascrivere l'origine per il designtime CollectionViewSource. Io uso la proprietà d:DesignSource di utilizzare un'altra risorsa designtime statica:

<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. non sono sicuro x:Static dovrebbe funzionare in d:DataContext, penso solo d: DesignInstance o d:DesignData potrebbe.
  2. Hai testato i dati del tempo di progettazione e sicuro che effettivamente riempito con i dati?
  3. Provare a specificare la proprietà d:IsDesignTimeCreatable=True nello d:DesignInstance.
  4. Anche se this è specifico per Silverlight, sono sicuro che potrebbe darti qualche suggerimento.

Dovrebbe generalmente simile a questa:

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

Si potrebbe utilizzare la stessa per entrambi ViewModel runtime e designtime, fare una proprietà IsInDesignTime in voi ViewModelBase e restituire i dati in modo appropriato.
Esempio:

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

Nota: Vi incoraggio ad utilizzare StaticResources (anziché DynamicResources) per i modelli o stili che non sono destinati a cambiare in fase di esecuzione. Leggi this per maggiori informazioni.

0

Non so se questo è ancora rilevante ... recentemente ha avuto un problema simile - Sono ancora da qualche parte sulla curva di apprendimento WPF, solo che non piuttosto sicuro dove ...

Comunque, ecco lo scenario: creerei un oggetto di tipo ObservableCollection da qualche parte nel mio spazio dei nomi locale (per mantenere le cose semplici), ad esempio ..

public class NodesCollection : ObservableCollection<Nodes> { }

Poi da Miscela/XAML, posso facilmente "Crea oggetto Data Source" (dal pannello di strumenti di data) e trovare NodesCollection viene mostrata e può essere selezionato.

Avanti, Miscela creerà una risorsa locale vicino alla parte superiore del file XAML, simile a:

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

Con questo, si può facilmente associare la proprietà ItemsSource di una casella di riepilogo all'origine dati che abbiamo appena creato. Ad esempio, fare clic con il pulsante destro del mouse sulla casella di riepilogo dal pannello degli strumenti "Oggetti e sequenza temporale" e selezionare "Data bind ItemsSource to Data .." Nella finestra di dialogo popup, è possibile vedere facilmente NodesCollectionDataSource disponibile e utilizzabile.

Tuttavia Ecco che arriva il problemi che ho avuto da risolvere ...

In alcuni libri che sto leggendo in questo momento, si parla di creazione di un CollectionViewSource in XAML che può essere utilizzato per l'ordinamento/raggruppamento/filtraggio/navigazione della sua origine dati sottostante.

Primo problema, non riesco a trovare CollectionViewSource ovunque in Blend; quindi l'unica opzione è creare manualmente il tag in Xaml.

Basta digitare <CollectionViewSource x:Key="cvsNodes" /> all'interno del blocco Risorse (Xaml) e da lì, è possibile modificare ulteriori proprietà utilizzando la GUI di Blend; ad esempio, impostare la proprietà Source sottostante e ulteriori Descrittori di ordinamento e gruppo (che si trovano sotto il pannello Strumenti risorse).

Ora arriva la parte in cui vogliamo associare la proprietà ItemsSource di ListBox a CollectionViewSource. Tuttavia non sarai in grado di trovare quell'elemento utilizzando la GUI di Blend. Pertanto è necessario digitare manualmente il valore di legame. Per esempio:

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

funziona. Ma per rendere ancora più facile, abbiamo bisogno di tornare all'elemento risorsa CollectionViewSource originale in XAML e aggiungere un attributo aggiuntivo:

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

Il d:IsDataSource="True" fa il trucco di avere Miscela GUI riconoscere che risorse come disponibile per essere utilizzato.

Ora se torniamo alla proprietà ItemsSource del ListBox dal pannello degli strumenti Proprietà, dovremmo essere in grado di selezionare cvsNodes dall'elenco delle origini dati disponibili.

Spero che questo aiuti chiunque potrebbe essere giunto alla mia stessa conclusione, ovvero Blend e la tecnologia Xaml sottostante non è completamente sincronizzata; e che Blend è al massimo uno strumento per generare Xaml, non una sostituzione per l'apprendimento del linguaggio Xaml.

+0

Anche solo per aiutare a rispondere alla domanda originale; Sì, questo consente a Blend di mostrare dati di esempio durante lo sviluppo. Tutto quello che devi fare è popolare alcuni dati di esempio all'interno del costruttore della tua classe ObjectCollection - nel mio caso, sarebbe il ctor di NodesCollection – klee

Problemi correlati