2009-11-13 19 views
6

Próbuję powiązać List z DataGrid. Oto fragment kodu:Wiązanie DataGrid do listy w wpf

public class Parson 
{ 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 

    public Parson(string lastName, string firstName) 
    { 
     LastName = lastName; 
     FirstName = firstName; 
    } 
} 

public class Persons : List<Parson> 
{ 
    // Parameterless constructor  
    public Persons() 
    { 
    } 
    public new void Add(Person parson) 
    { 
     base.Add(parson); 
    } 
} 

kod za:

Persons persons = new Persons(); 
persons.Add(new Parson("New","Person"); 
dataGrid1.DataContext = persons; 

XAML: jest, że wyświetlana jest pusta siatka

<my:DataGrid Name="dataGrid1" 
      xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" 
      CanUserAddRows="True" 
      ItemsSource="{Binding}" 
      AutoGenerateColumns="False"> 
    <my:DataGrid.Columns> 
     <my:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"/> 
     <my:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}"/> 
    </my:DataGrid.Columns> 
</my:DataGrid> 

Rezultatem! Ktoś wie dlaczego?

+0

XAML: < /my:DataGrid.Columns>

+0

Czy okno wyjściowe zawiera coś związanego z tym powiązaniem? – andyp

+0

Twój kod działa i działa dla mnie. Gdzie ustawiasz DataContext siatki? Ustawiłem go w Window.Loaded. – ArildF

Odpowiedz

1

Spróbuj ustawić ItemsSource zamiast DataContext i usunąć ItemsSource={Binding} ze swojego XAML. To może załatwić sprawę.

Edit:

Właśnie sprawdziłem kodu napisałem, że wykorzystuje ten sam formant DataGrid (WPF Toolkit), a ja w rzeczywistości ustaliła wysokość ItemsSource zamiast DataContext. Jeśli potrzebujesz przykładu, daj mi znać.

+0

Próbowałem. Nie działa dla mnie. Proszę podać przykład kodu. –

0

W swojej próbie DataGrid:

ItemsSource="{Binding Path=.}" 

ten pracował dla mnie pomyślnie.

+0

nie działa dla mnie ... –

5

Spróbuj ustawić AutoGenerateColumns = true

5

(Uwaga: Ta odpowiedź została zweryfikowana w .NET Framework v4.0):

Prosty, operacja 4-częściowy ...

  • pierwsze, na twoja kontrola DataGrid w marży XAML Polecam ustawić AutoGenerateColumns="False" (powinieneś być w stanie zrobić to ręcznie lepiej niż może to zrobić automatycznie)
  • sekunda, na tym samym zestawie kontrolnym ItemsSource="{Binding}", który informuje sieć, że będzie pobierał dane z kolumny i wiersza ze źródła nie zdefiniowanego w czasie projektowania.
  • po trzecie, skonstruuj kolumny, aby wyglądały tak, jak chcesz, aby wyglądały i dla każdego powiązania z danymi kolumny z czymś takim, jak Binding="{Binding Path=UniqueID}". Zauważ, że wartość po ścieżce jest interpolowana, więc pamiętaj o takich elementach, jak rozróżnianie wielkości liter. Dla listy <> celujesz, że wartość będzie prawdopodobnie jedną z nazw właściwości z obiektów na liście docelowej <>. Przepłucz i powtórz tyle razy, ile potrzeba dla każdej kolumny w DataGrid.
  • po czwarte, w formularzu z tyłu kodu, w konstruktorze lub podczas ładowania formularza lub w dowolnym miejscu, które najlepiej odpowiada Twoim potrzebom, ustaw DataContext siatki. To powinno przybrać formę podobną do {gridControlName}.DataContext = {target-List<>}

Gdy formularz jest ładowany swoją siatkę powinien automatycznie wprowadzony treści z obiektów w listy <>.

+1

Musiałem również upewnić się, że wszystkie kolumny DataGrid odwoływały się do właściwości klasy (np. Public int MyColumn {get; set;}), a nie tylko do pól klasy (np. Public int MyColumn;) – Justas

+1

Ustawienie właściwości .DataContext musi nastąpić po wywołaniu funkcji InitializeComponent() – Justas