2011-01-19 24 views
12

Se voglio legare qualcosa come una combobox nel code-behind non ho alcun problema. Qualcosa di simile:E 'possibile fare una lista <string> una risorsa statica in xaml?

List<string> strings = new List<string>(); 
AddStringsFromDataSourceToList(strings); 

comboBox1.ItemSource = strings; 

Per quanto posso dire, non esiste un modo rapido e sporco per farlo in XAML. Per tutto il lode che wpf sta ricevendo per il suo super semplice databinding, qualcosa di semplice sembra molto più semplice da fare in C#. C'è un modo più semplice per farlo rispetto alla creazione di wrapper DependencyProperty e aggiungendoli come risorse senza molto aiuto da intellisense o da tutto ciò che riguarda ObservableCollections? Capisco che non sia impossibile, ma mi manca qualcosa se un compito così semplice sembra così approfondito ...

EDIT: Per chiarire, l'aggiunta di elenchi dinamici è il problema qui, non gli array statici. È molto facile aggiungere gli oggetti manualmente, come molti hanno sottolineato.

+1

WPF ottiene il suo elogio per il fatto che consente gentilmente di separare la logica dal design e così via - non perché possa fare tutto e qualsiasi cosa. –

+0

@ Disappointment - Questo non è niente di troppo pazzo ... certamente non "niente e tutto". È semplicemente una questione di convinzione di uno dei compiti più comuni nella creazione di app. –

+0

So che non è pazzesco; ma una volta che inizi a diventare compiacente e lavori sulla falsariga di "incorporerò semplicemente questo dato nell'interfaccia utente ..." chissà dove finirà? E se stiamo parlando di "dati" che possono essenzialmente essere considerati parte dell'interfaccia utente, come un elenco di opzioni a discesa che sono comuni e costanti, in genere è il contenitore di utilizzo che viene astratto e riutilizzato. Non ti sto prendendo, la domanda, o il metodo, solo affermando alcune cose, a proposito. –

risposta

3

che ci sia:

<ComboBox> 
    <ComboBoxItem>One</ComboBoxItem> 
    <ComboBoxItem>Two</ComboBoxItem> 
</ComboBox> 

ci sono altre sintassi a seconda del vostro obiettivo che sono quasi come semplice - utilizzando risorse o itemssources in linea, o dati raggruppati .. anche xml dati. Non alzare le mani per la frustrazione perché la prima cosa che hai provato non è stata semplice: wpf vale la curva di apprendimento, secondo me.

WPF ottiene lode perché fa separare la grafica dal comportamento molto più facile rispetto a Windows forme, sia perché permette di creare divertenti effetti visivi molto molto più facile, non perché rende più facile per fare esempi banali. Tuttavia, in questo caso - è è più facile da fare l'esempio banale.

Con la modifica Da dove si desidera estrarli? Non è necessario creare proprietà di dipendenza o raccolte osservabili con qualsiasi mezzo. Una semplice lista di proprietà farà (preferisco usare una collectionviewsource in xaml in quel caso).Inoltre, non dimenticare che non è necessario per utilizzare tutto XAML se lo si odia. Ma se progetti per WPF invece di farlo, troverai molte attività (come questa) facili.

+0

Siamo spiacenti, non ero chiaro, ma sto cercando un modo per aggiungere contenuto dinamico (ad esempio da un elenco in cui i valori non sono noti). –

+2

@Prof Plum Suppongo di non capire: vuoi che xaml abbia una risorsa statica senza codice, ma vuoi che i valori siano dinamici? Dove/quando verranno impostati i valori? –

+0

Grazie, cosa comporta il metodo di raccolta delle risorse? Se sei a conoscenza di link che dimostrano un uso conciso oltre a MSDN, sarebbe molto utile. –

1

si può fare:

<ComboBox> 
     <ComboBoxItem>one</ComboBoxItem> 
     <ComboBoxItem>two</ComboBoxItem> 
    </ComboBox> 

ed esiste anche la sintassi per la dichiarazione (e implicitamente la creazione) i dati in, ad esempio una sezione di risorse.

Forse è possibile indicare uno scenario più completo, con i requisiti e i vincoli?

+0

modificato per mostrare cosa stavo veramente ottenendo: quando gli elementi dell'elenco sono sconosciuti. –

+1

Ora sembra che vogliate mescolare imperativo C# nello XAML dichiarativo. Se si trasforma la funzione in una proprietà che hai finito. –

5

Siete alla ricerca di qualcosa di simile:

<ComboBox> 
    <ComboBox.ItemsSource> 
     <x:Array Type="sys:String" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
      <sys:String>One</sys:String> 
      <sys:String>Two</sys:String> 
     </x:Array> 
    </ComboBox.ItemsSource>     
</ComboBox> 

Se solo si desidera definire alcuni elementi per una lista, guarda la soluzione da Henk Holterman. A proposito, puoi dichiarare l'array anche come risorsa e per altri tipi.

Aggiornamento

Sembra che hai cambiato la tua domanda. Tuttavia non capisco ora quale sia il tuo desiderio. Se si desidera associare una collezione che avete nella vostra code-behind, poi fare una proprietà pubblica che restituisce questa collezione, impostare il DataContext all'oggetto che espone questa proprietà e definire una rilegatura in XAML:

<ComboBox ItemsSource="{Binding NameOfYourCollectionProperty}"... 

Speranza ho capito la tua domanda giusta ...

33
<Window.Resources> 
    <x:Array x:Key="strings" Type="sys:String" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
      <sys:String>One</sys:String> 
      <sys:String>Two</sys:String> 
    </x:Array> 
    <!-- likewise --> 
    <x:Array x:Key="persons" Type="{x:Type local:Person}" 
      xmlns:local="clr-namespace:namespace-where-person-is-defined"> 
      <local:Person FirstName="Sarfaraz" LastName="Nawaz"/> 
      <local:Person FirstName="Prof" LastName="Plum"/> 
    </x:Array> 
<Window.Resources> 


<ComboBox ItemsSource="{StaticResource strings}" /> 

<ListBox ItemsSource="{StaticResource persons}"> 
    <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock> 
        <Run Text="{Binding FirstName}"/> 
        <Run Text=" "/> 
        <Run Text="{Binding LastName}"/> 
       </TextBlock> 
      </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Preferirei avere gli xmlns definiti a livello di finestra, ad es. '' invece che sulle risorse dell'array. Questo è XAML standard solido molto pulito. – cod3monk3y

+0

Solo un avviso, nel tuo xaml hai , ma dovrebbe essere . Non riesco a effettuare la modifica poiché è inferiore a 6 caratteri. – edhedges

+0

@edhedges: corretto. Grazie. – Nawaz

Problemi correlati