2010-01-25 13 views
5

Mam listę niestandardowych obiektów: powiedz Owoce o dwóch właściwościach ciągów Nazwa i kolor. Są na liście.Wiązanie Datagrid WPF do listy problemów

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

Następnie ładuję obiekty owocowe do listy.

Próbuję powiązać tę listę do 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> 

Powód są w combobox, ponieważ chcę aby użytkownik w stanie zmienić związek. To nie jest prawdziwy przykład, ale masz pomysł. Powiedzmy dla przykładu, że owoc nie był dojrzały, więc zmieniają kolor bananowy na zielony :)

Nie mam żadnego szczęścia, dostając te przedmioty w datagrid ... i na dół utworu, chcę kliknij element w datagridcell zmienić na combobox i pokazać wszystkie możliwe typy nazw owoców i kolorów (dzięki czemu mogą one zmienić relacje)

Oto błąd dostaję:

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 ktoś pomoże? Powodem, dla którego ustawiam moje kolumny w xaml, mogę ustawić szerokość na rozmiar gwiazdy i kolumny mają taką samą szerokość.

Widzę większość przykładów użycia ObservableCollection, ale jeśli mogę powiązać listę, dlaczego muszę tego użyć?

Proszę pozwolić mi knwo jeśli mój przykład wymaga dalszych wyjaśnień

Edycja: co mam teraz:

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; 

Właściwie kiedy używam DataContext, nie otrzymuję ite ms. Kiedy używam ItemSource, otrzymuję puste wiersze, ale poprawną liczbę wierszy, więc wydaje się bardziej wzdłuż właściwych linii.

Mogę uzyskać dane do wyświetlenia, jeśli pozwolę na automatyczne generowanie kolumn. Jeśli ustawię autogeneratecolumns na false, a następnie określ moje kolumny w xaml, tak jak chcę użyć rozmiaru gwiazdy, otrzymam odpowiednią liczbę kolumn, ale bez tekstu!

Odpowiedz

4

Pierwszy, to:

dgFruit.ItemsSource = "{Binding}" 

należy ustawić źródło elementów do łańcucha zawierającego słowo wiąże w szelki. To prawie na pewno nie jest to, czego potrzebujesz (w rzeczywistości, jeśli to zrobisz, powinieneś skończyć siatkę z dziewięcioma rzędami, po jednym dla każdego znaku w ciągu!). Możesz ustawić ItemsSource w XAML lub kod, ale nie powinieneś robić obu. Spróbuj wykonać następujące czynności:

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

a potem w swoim wizualnym za konstruktora:

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

Teraz kontekst dla Twojego cały wizualny lista <Fruit> i ItemsSource twojej sieci jest ustawiona jako ten sam obiekt. Zakładam, że fruitList to pole wizualne.

Wiązania dla Twoich kolumn powinna wyglądać mniej więcej tak:

 <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*" /> 

Gdzie AllColors jest zdefiniowany jako zasób (w tym przypadku):

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

To powinno Ci zacząć.

+0

to owrks, ale kiedy to zrobię, kolumny zdefiniowane w Xaml są ignorowane i dodaje nowe po lewej. Czy mogę programowo ustawić rozmiary gwiazd dla tych kolumn generowanych automatycznie? – baron

+0

Możesz wyłączyć te generowane automatycznie. Na karcie DataGrid w XAML: AutoGenerateColumns = "Fałsz" – lesscode

+0

coraz bliżej, teraz żadnych elementów pokaż :(zobacz ostatnią edycję – baron

4

WPF nie obsługuje wiązania z polami. Utwórz właściwość, która uzyskuje dostęp do fruitList i powiąż ją.

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

Zastosowanie dgFruit.DataContext = this; zamiast dgFruit.ItemsSource = "{Binding}";

A jeśli chcesz pokazać je w ComboBox, trzeba powiązać te DataGridComboBoxColumn do listy kolorów, a nie tylko ciąg.Na przykład, klasa może wyglądać

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 
} 

I można użyć List jeśli chcesz. Zaletą ObservableCollection jest już implementuje INotifyCollectionChanged i INotifyPropertyChanged dla Ciebie

+0

Nie rozumiem, co masz na myśli, tworząc właściwość, która uzyskuje dostęp do listy owoców. Chyba mógłbym użyć ObservableCollection tylko dlatego, że używam list wszędzie indziej. I nie podoba mi się, że musi to być lista. Chcę, aby ta lista była wszystkimi wartościami w Fruit.Color lub Fruit.Name. W widoku siatki widać pierwotną relację, tj. Apple -> Red i Banana -> Yellow są wartościami, ale jeśli kliknę dwukrotnie Apple to zobaczę combo ze wszystkimi opcjami obiektów owocowych, więc Apple i Banana, i podobnie z kolorem. – baron