Domanda

Ho cercare di alta e bassa e non riesco a trovare una risposta a questo. Ho due domande

  1. Come si crea un array o di raccolta in XAML. Ho un allineamento voglio attaccare in là e legarsi a una casella combinata. La mia prima idea era quella di porre ItemsControl in un dizionario risorse, ma l'ItemsSource di una casella combinata si aspetta IEnumerable in modo che non ha funzionato.

Ecco quello che ho provato nel mio dizionario risorse e né lavori

<ItemsControl x:Key="stateList">
    <sys:String>AL</sys:String>
    <sys:String>CA</sys:String>
    <sys:String>CN</sys:String>
</ItemsControl>
<ItemsControl x:Key="stateList2">
    <ComboBoxItem>AL</ComboBoxItem>
    <ComboBoxItem>CA</ComboBoxItem>
    <ComboBoxItem>CN</ComboBoxItem>
</ItemsControl>

ed è così che mi legano ad esso qui

<ComboBox SelectedValue="{Binding Path=State}" ItemsSource="{Binding Source={StaticResource stateList2}}"  >

                    </ComboBox>

EDIT: AGGIORNATO

ho avuto questa prima parte a lavorare in questo modo

 <col:ArrayList x:Key="stateList3">
    <sys:String>AL</sys:String>
    <sys:String>CA</sys:String>
    <sys:String>CN</sys:String>
</col:ArrayList>

Comunque, preferisco non usare una lista di array, mi piacerebbe usare un elenco generico così se qualcuno sa come fatemelo sapere.

EDIT UPDATE: Credo XAML ha un supporto molto limitato per i medicinali generici, quindi forse una lista di array è il meglio che posso fare per ora, ma mi piace ancora di aiuto sulla seconda questione se qualcuno ha un Anser

2 °. Ho provato riferimento a un dizionario risorsa unita nel mio XAML e ha avuto problemi perché sotto Window.resources ho avuto più di un semplice dizionario in modo che mi ha richiesto di aggiungere x: Key. Una volta aggiungo la chiave, il sistema non può più trovare gli articoli nel mio dizionario risorse. Ho dovuto spostare il dizionario risultante dalla concentrazione di Grid.Resources invece. Idealmente mi piacerebbe fare riferimento al dizionario fusione nel App.xaml ma ho lo stesso problema

Ecco alcuni esempi di codice. Questa prima parte ha richiesto un x: chiave per la compilazione perché ho convertitore e si lamentava che ogni articolo deve avere una chiave se non v'è più di un

<UserControl.Resources>
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

ho dovuto cambiare a questo

<UI:BaseStep.Resources>
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />             
</UI:BaseStep.Resources>
<Grid>
    <Grid.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourcesD.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Grid.Resources>
</Grid>

Grazie

È stato utile?

Soluzione

Per quanto ho capito il problema che si desidera associare un ComboBox (o un ListBox) con una serie di elementi, giusto? Se si desidera che gli elementi da una sorgente dati esterna, si può solo fare uso di comodo di proprietà DataContext. Cerca MSDN per ulteriori informazioni su questo. Tuttavia, se si vuole una raccolta manuale, fare in questo modo:

Crea la propria classe:

public class StringCollection : ObservableCollection<string> { }

e ora usare in questo modo:

<Window.Resources>
    <local:StringCollection x:Key="stringCollection">
        <sys:String>Hello</sys:String>
        <sys:String>World</sys:String>
    </local:stringCollection>
</Window.Resources>

...

    <ListBox
        Margin="15"
        ItemsSource="{StaticResource stringCollection}" />

In alternativa, se si desidera che la raccolta più generico creare una classe come questa:

public class ObjectCollection : ObservableCollection<object> { }

e usarlo in questo modo:

    <local:ObjectCollection x:Key="objectCollection">
        <sys:String>Hello</sys:String>
        <TextBlock>World</TextBlock>
        <sys:Int32>12345</sys:Int32>
    </local:ObjectCollection>

    ...

    <ComboBox
        Margin="15"
        ItemsSource="{StaticResource objectCollection}" />


Si consiglia inoltre di fare uso di alcune classi in-costruito come Int32Collection che implementa IEnumerable. È possibile utilizzarli direttamente come una risorsa.


La proprietà Resources (di qualsiasi FrameworkElement come Window, UserControl, o Application) è di tipo ResourceDictionary non raccolta di dizionari di risorse! in modo da non possono fare in questo modo:

<UserControl.Resources>

    <!-- The first RD -->
    <!--<ResourceDictionary>
        <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
    </ResourceDictionary>-->

    <!-- Second RD!!! -->
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Invece che fare in questo modo:

<UserControl.Resources>

    <!-- 
        There should be only 1 main RD, 
        Merge other RDs, if any
     -->
    <ResourceDictionary>

        <!-- First Resource -->
        <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />

        <!-- Second Resource -->
        <ResourceDictionary.MergedDictionaries>
            <!-- Now, there can be multiple RDs -->
            <ResourceDictionary Source="/ResourcesA.xaml" />
            <ResourceDictionary Source="/ResourcesB.xaml" />
            <ResourceDictionary Source="/ResourcesC.xaml" />
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

</UserControl.Resources>

Spero che questo aiuti.
Saluti,
Mihir Gokani

Altri suggerimenti

Si prega di correggermi se sbaglio, ma credo che si desidera qualcosa di simile?

<Grid.Resources>
  <local:MyCustomCollection x:Key="local:MyCustomCollection"/>
</Brid.Resources>

Nella parte superiore della finestra che ci si dispone di una proprietà:

xmlns:local="clr-namespace:MyNamespace"

E dentro il codice che avrebbe dovuto:

MyCustomCollection  custCol = MyGrid.Resources["MyCustomCollection"] as MyCustomCollection;

Binding accadrebbe su un controllo con un qualcosa di proprietà come questa:

ItemsSource="{StaticResource MyCustomCollection}"

Per le risorse, non vi resta che mover vostro convertitore supplementare nella ResourceDictionary di recente dichiarato:

<App.Resources> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 

    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary> 
</App.Resources> 

Se si aggiunge dizionario risorse all'interno delle risorse di Windows, non sarà in grado di accedervi ovunque, invece si dovrebbe aggiungere in "App" s 'risorse (check out App.xaml file).

<App.Resources> 
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</App.Resources> 

Questa sarà disponibile in ogni oggetto WPF indipendentemente da creare qualsiasi gerarchia di ereditarietà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top