2010-01-25 18 views
5

Ho un elenco di oggetti personalizzati: ad esempio Frutta con due proprietà stringa Nome e Colore. Questi sono in una lista.Associazione WAGF Datagrid per elencare i problemi

private readonly List<Fruit> fruitList = new List<Fruit>(); 

Quindi carico gli oggetti frutta nella lista.

Sto cercando di legare questa lista per WPF Datagrid:

C#:

dgFruit.ItemsSource = "{Binding}"; 

XAML:

<toolkit:DataGrid Name="dgFruit" 
      ItemsSource="{Binding Path=fruitList}" > 
       <toolkit:DataGrid.Columns> 

        <toolkit:DataGridComboBoxColumn 
      Header="Name" 
      SelectedValueBinding="{Binding Path=Name}" 
      TextBinding="{Binding Path=Name}" Width="5*" /> 

        <toolkit:DataGridComboBoxColumn 
      Header="Color" 
      SelectedValueBinding="{Binding Path=Color}" 
      TextBinding="{Binding Path=Color}" Width="5*" /> 

       </toolkit:DataGrid.Columns> 
      </toolkit:DataGrid> 

motivo sono in una casella combinata è perché voglio utente sia in grado di cambiare la relazione. Questo non è il vero esempio, ma hai un'idea. Per esempio, il frutto non era maturo, quindi cambiano il colore della banana in verde :)

Non ho alcuna fortuna a ottenere questi elementi nel datagrid ... e in fondo alla traccia, voglio un fare clic sulla voce nella datagridcell per passare alla casella combinata e mostrare tutti i possibili tipi di frutta nomi e colori (in modo che possano cambiare i rapporti)

Ecco un errore che sto ricevendo:

System.Windows.Data Error: 39 : BindingExpression path error: 'Color' property not found on 'object' ''Char' (HashCode=6750311)'. BindingExpression:Path=Color; DataItem='Char' (HashCode=6750311); target element is 'TextBlockComboBox' (Name=''); target property is 'Text' (type 'String') 

Can qualcuno ti aiuta? La ragione per cui sto impostando le mie colonne in xaml è che posso impostare la larghezza alle dimensioni della stella e avere le colonne di uguale larghezza.

Vedo la maggior parte degli esempi utilizzare ObservableCollection ma se riesco a legare alla lista perché devo usare questo?

favore fatemi knwo se il mio esempio richiede ulteriori chiarimenti

Edit: quello che ho adesso:

XAML:

  <toolkit:DataGrid Name="dgFruit" 
      ItemsSource="{Binding}" 
      AutoGenerateColumns="False"> 

       <toolkit:DataGrid.Columns> 
        <toolkit:DataGridTextColumn 
         Header="Name" 
         Width="5*"/> 

        <toolkit:DataGridComboBoxColumn 
      Header="Color" 
      Width="5*"/> 

        </toolkit:DataGrid.Columns> 
</toolkit:DataGrid> 

C#:

DataContext = fruitList; 

realtà quando uso DataContext non ho capito Signorina. Quando uso ItemSource ottengo linee vuote, ma il numero corretto di righe, quindi questo sembra più lungo le linee giuste.

Posso ottenere i dati per mostrare se lo lascio Automatico generare colonne. Se metto autogeneratecolumns su false e poi specifico le mie colonne in xaml come se volessi usare il dimensionamento a stella, ottengo il giusto numero di colonne ma nessun testo!

risposta

4

In primo luogo, questo:

dgFruit.ItemsSource = "{Binding}" 

dovrebbe impostare la sorgente di elementi da una stringa contenente la parola Binding tra parentesi graffe. Questo non è quasi certamente quello che vuoi (in effetti, se lo fai dovresti ritrovarti con una griglia con nove righe, una per ogni carattere nella stringa!). È possibile impostare ItemsSource in XAML o nel codice sottostante, ma non si dovrebbero fare entrambe le cose. Provare quanto segue:

<toolkit:DataGrid Name="dgFruit"  
        ItemsSource="{Binding}"> 
    ... 
</toolkit:DataGrid> 

E poi nella vostra di visiva costruttore:

... 
    InitializeComponents(); 
    this.DataContext = fruitList; 
... 

Ora il contesto dati per la vostra intera visiva è la lista <Frutta>, e l'ItemsSource della griglia è impostato per essere lo stesso oggetto. Presumo qui che fruitList sia un campo visivo in sé.

Le associazioni per le colonne dovrebbe essere simile a:

 <toolkit:DataGridTextColumn Header="Name" 
            Binding="{Binding Name}" 
            Width="5*" /> 
     <toolkit:DataGridComboBoxColumn Header="Color" 
             ItemsSource="{Binding Source={StaticResource AllColors}}" 
             SelectedValueBinding="{Binding Path=Color}" 
             TextBinding="{Binding Path=Color}" 
             Width="5*" /> 

Dove Allcolors è definito come una risorsa (in questo caso):

<x:Array x:Key="AllColors" 
     Type="sys:String"> 
    <sys:String>Orange</sys:String> 
    <sys:String>Yellow</sys:String> 
</x:Array> 

Questo dovrebbe iniziare.

+0

si arresta ma quando lo faccio le colonne che definisco in xaml vengono ignorate e ne aggiungono di nuove a sinistra. Posso programmare in modo programmato le dimensioni delle stelle per queste colonne generate automaticamente? – baron

+0

È possibile disattivare quelli generati automaticamente. Sul tuo DataGrid in XAML: AutoGenerateColumns = "False" – lesscode

+0

avvicinarsi, ora nessun articolo mostra però :(vedi modifica recente – baron

4

WPF non supporta il binding ai campi. Creare una proprietà che acceda a fruitList e associare a quello.

// this is the field. you can't bind to this 
    private readonly List<Fruit> fruitList = new List<Fruit>(); 

    // this is the property. you can bind to this 
    public List<Fruit> FruitList 
    { 
     get { return fruitList; } 
    } 

Uso dgFruit.DataContext = this; invece di dgFruit.ItemsSource = "{Binding}";

E se si desidera visualizzare questi in un ComboBox, hai bisogno di impegnare quelle DataGridComboBoxColumn ad una lista di colori, non solo una stringa.Ad esempio, la classe potrebbe essere simile

public class Fruit 
{ 
    public string Name { get; set; } 
    public string Color { get; set; } // bind the combobox selectedvalue to this 

    public List<string> AvailableColors { get; set; } // bind the combobox ItemsSource to this 
} 

e si può utilizzare un List, se volete. Il vantaggio di ObservableCollection è implementa già INotifyCollectionChanged e INotifyPropertyChanged per voi

+0

Non capisco cosa intendi creando una proprietà che accede alla lista dei frutti. Immagino che potrei usare ObservableCollection solo per il fatto che io uso le liste ovunque. E ho capito che deve essere una lista. Voglio che la lista sia tutti i valori in Fruit.Color o Fruit.Name. Il gridview shuold mostra la relazione originale, cioè Apple -> Red e Banana -> Yellow sono i valori ma se faccio doppio clic su Apple vedo la combo con tutte le opzioni di oggetti frutta, quindi Apple e Banana, e allo stesso modo con il Colore .. – baron

Problemi correlati