Powiązanie danych i listy
Do tej pory do wyświetlania i edytowania właściwości pojedynczego obiektu użyto tylko powiązania danych. W tej lekcji zastosujesz koncepcje powiązania danych, aby wyświetlić kolekcję obiektów. Aby ułatwić sobie sprawę, te obiekty będą kolorami. Mówiąc dokładniej, będą to wiele wystąpień ColorDescriptor
klasy.
1. Tworzenie ColorDescriptor
klasy
Utwórzmy klasę reprezentującą kolor. Kliknij prawym przyciskiem myszy DatabindingSample
projekt w Eksplorator rozwiązań, wybierz pozycję Dodaj / Klasa, a następnie wprowadź ColorDescriptor
jako nazwę klasy. Wybierz pozycję Dodaj , aby utworzyć klasę.
ColorDescriptor
zawiera dwie właściwości: sam kolor jako Windows.UI.Color
obiekt i nazwę koloru. Ma również konstruktor, który wypełnia te właściwości, metodę ToString()
, która wyświetla nazwę koloru i wartości szesnastkowy dla składników kolorów R, G i B. Oto cała ColorDescriptor
klasa.
using Windows.UI;
namespace DatabindingSample
{
public class ColorDescriptor : ObservableObject
{
public ColorDescriptor(Color color, string name)
{
Color = color;
Name = name;
}
public Color Color { get; private set; }
public string Name { get; private set; }
public override string ToString()
{
return $"{Name} (#{Color.R:X2}{Color.G:X2}{Color.B:X2})";
}
}
}
Zastąp domyślną zawartość pliku ColorDescriptor.cs poprzednim kodem.
2. Tworzenie strony ColorList.xaml
Aby wyświetlić listę kolorów, użyjemy nowej strony XAML. Kliknij prawym przyciskiem myszy DatabindingSample
projekt w Eksplorator rozwiązań, a następnie wybierz polecenie Dodaj/Nowy element. Wybierz pozycję Pusta strona z listy dostępnych elementów, a następnie wprowadź ColorList
jako nazwę. Wybierz pozycję Dodaj , aby utworzyć stronę.
3. Ustawianie strony uruchamiania
Teraz po uruchomieniu aplikacji zostanie otwarta strona MainPage . Ponieważ będziesz pracować z nowo utworzoną stroną ColorList.xaml, warto mieć ją jako stronę początkową. Aby to się stało, otwórz plik App.xaml.cs i znajdź wiersz, który przechodzi do strony MainPage.
rootFrame.Navigate(typeof(MainPage), e.Arguments);
Zastąp ciąg MainPage
ciąg , ColorList
a następnie sprawdź, czy strona ColorList jest uruchamiana po uruchomieniu aplikacji (naciśnij klawisz F5 lub wybierz pozycję Debuguj/ Rozpocznij debugowanie).
4. Tworzenie logiki dla listy kolorów
Będziemy kontynuować wcześniej wprowadzone najlepsze rozwiązanie dotyczące tworzenia oddzielnej logiki dla nowej strony. Dlatego utwórz nową klasę o nazwie ColorListLogic
.
Kliknij prawym przyciskiem myszy DatabindingSample
projekt w Eksplorator rozwiązań, wybierz pozycję Dodaj / Klasa, a następnie wprowadź ColorListLogic
jako nazwę klasy. Wybierz pozycję Dodaj , aby utworzyć klasę, i wklej następujący kod do pliku:
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Windows.UI;
namespace DatabindingSample
{
public class ColorListLogic : ObservableObject
{
public List<ColorDescriptor> LotsOfColors { get; private set; }
public ColorListLogic()
{
LotsOfColors = new List<ColorDescriptor>
{
new ColorDescriptor(Colors.Red, "red"),
new ColorDescriptor(Colors.White, "white"),
new ColorDescriptor(Colors.Green, "green"),
new ColorDescriptor(Colors.Yellow, "yellow"),
new ColorDescriptor(Colors.Blue, "blue"),
new ColorDescriptor(Colors.Black, "black")
};
}
}
}
Klasa ColorListLogic
jest bardzo prosta (na razie). Ma właściwość o nazwie LotsOfColors
, która jest obiektem List
ColorDescriptor
. Lista jest wypełniona kilkoma kolorami w konstruktorze klasy. To wszystko.
5. Wyświetlanie kolorów w obiekcie ListBox
Następnym krokiem jest wyświetlenie kolorów w naszej aplikacji. Najpierw udostępnijmy kod ColorListLogic
XAML. Otwórz plik ColorList.xaml.cs
i dodaj go do ColorList
klasy :
public ColorListLogic Logic { get; } = new ColorListLogic();
W tym miejscu używamy tej samej składni, co MainPageLogic
wcześniej. Tworzy właściwość tylko do pobrania i inicjuje jej wartość do nowo utworzonego ColorListLogic
obiektu.
Następnie otwórz plik ColorList.xaml i dodaj następujący kod XAML wewnątrz Grid
elementu.
<ListBox ItemsSource="{x:Bind Logic.LotsOfColors}"
Margin="20"
Width="200"
HorizontalAlignment="Left"
VerticalAlignment="Top"/>
Interesującą ItemsSource
częścią jest atrybut . Jak sugeruje nazwa, dostarcza źródło elementów wyświetlanych w pliku ListBox
. I jest to po prostu powiązane z właściwością ColorListLogic
LotsOfColors
".
Jeśli teraz uruchomisz aplikację, będzie ona wyświetlać kolory w programie ListBox
! Ale to nie jest zbyt miłe, aby spojrzeć na. Wydaje ListBox
się, że wywołano metodę ToString()
ColorDescriptor
s przechowywaną na LotsOfColors
liście.
6. Zdefiniuj szablon dla elementów
Dobrze byłoby mieć szablon, który pokazuje rzeczywisty kolor przechowywany we ColorDescriptor.Color
właściwości i jego nazwę. Coś takiego:
Aby kodować to w języku XAML, możemy umieścić kolor i Rectangle
znak TextBlock
w obiekcie StackPanel
.
<StackPanel Orientation="Horizontal">
<Rectangle Width="80" Height="20">
<Rectangle.Fill>
<SolidColorBrush Color="Blue"/>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="blue" Margin="20, 10, 0, 10"/>
</StackPanel>
Jest to jedna z zalet języka XAML i powiązania danych. Prawie każda złożona wizualizacja opiera się na szablonach, które można ponownie zdefiniować. Aby użyć powyższego StackPanel
szablonu, musimy umieścić go wewnątrz DataTemplate
elementu . Należy DataTemplate
zdefiniować element , który jest typem DataType
danych, do których można zastosować szablon. W naszym przypadku jest ColorDescriptor
to klasa . Wygląda więc następująco DataTemplate
:
<DataTemplate x:DataType="local:ColorDescriptor">
<!-- template content comes here -->
</DataTemplate>
Sposób renderowania danych w elemecie ListBox
(i wielu innych kontrolkach) jest kontrolowany przez element ItemTemplate
, który powinien być ustawiony na DataTemplate
wartość . Istnieje wiele sposobów, aby to zrobić. W tej lekcji po prostu zdefiniujemy wewnątrz DataTemplate
ListBox
elementu , z następującą składnią:
<ListBox ...>
<ListBox.ItemsSource>
<DataTemplate ...>
...
</DataTemplate>
</ListBox.ItemsSource>
</ListBox>
Później zobaczysz, jak można ponownie użyć elementu DataTemplate
w wielu miejscach, definiując go jako zasób.
Teraz całość ListBox
wygląda następująco (jeśli nie wykonano tej czynności, zastąp cały <ListBox>
tag następującym kodem XAML):
<ListBox ItemsSource="{x:Bind Logic.LotsOfColors}"
Margin="20"
Width="200"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="local:ColorDescriptor">
<StackPanel Orientation="Horizontal">
<Rectangle Width="80"
Height="20">
<Rectangle.Fill>
<SolidColorBrush Color="{x:Bind Color}"/>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="{x:Bind Name}"
Margin="20, 10, 0, 10"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Należy pamiętać, że ponieważ każdy element w ListBox
obiekcie odpowiada ColorDescriptor
obiektowi, wystarczy zdefiniować powiązania wewnątrz szablonu w kontekście tej klasy. Kompilator sprawdza nawet, czy Logic.LotsOfColors
obiekt zawiera ColorDescriptor
i które ColorDescriptor.Color
istnieją i ColorDescriptor.Name
są odpowiedniego typu.
7. Uruchamianie aplikacji
Uruchom aplikację teraz, naciskając klawisz F5 lub wybierając pozycję Debuguj/Rozpocznij debugowanie w menu. Powinna zostać wyświetlona lista kolorów w całej jego chwały.
Jeśli uruchamiasz aplikację XAML w trybie debugowania, możesz skorzystać z funkcji edycji XAML na żywo. Nie musisz nawet zatrzymywać aplikacji ani naciskać przycisku Zapisz. Wystarczy zmienić kod XAML, a większość zmian zostanie natychmiast odzwierciedlona w uruchomionej aplikacji. Wypróbuj teraz. Zmień wartości Width
i Height
Rectangle
wewnątrz szablonu danych na 30, zamieniając w ten sposób prostokąty koloru na kwadraty.
Jest to nazywane Przeładowywanie na gorąco XAML i może być przydatne do dostrajania układu i animacji w aplikacji.
Podsumowanie
W tej lekcji przedstawiono podstawy wyświetlania wielu elementów w obiekcie ListBox
. Istnieją inne mechanizmy kontroli dostępne do podobnych celów, takie jak ItemsControl
, ListView
i GridView
. Jednak podstawowe zasady są takie same: powiąż listę (IEnumerable
, List<>
) obiektów z właściwością ItemsSource
i zdefiniuj DataTemplates
, aby kontrolować sposób wyświetlania i zachowania poszczególnych elementów listy. Można również ponownie zdefiniować układ tych elementów, a nawet wygląd samych kontrolek kontenera (chociaż wykracza to poza zakres tego modułu).
Należy pamiętać, że kod nigdy nie musiał radzić sobie z ListBox
samym sobą. Właśnie utworzono kolekcję obiektów biznesowych (ColorDescriptor
), a środowisko uruchomieniowe XAML zajęło się rozszerzeniem szablonu dla każdego elementu.
W następnej lekcji pokazano, jak można wybrać elementy z ListBox
listy rozwijanej lub oraz zmienić zawartość list z kodu, tak aby dodawanie i usuwanie elementów było odzwierciedlane w interfejsie użytkownika.
Do tej pory do wyświetlania i edytowania właściwości pojedynczego obiektu użyto tylko powiązania danych. W tej lekcji zastosujesz koncepcje powiązania danych, aby wyświetlić kolekcję obiektów. Aby ułatwić sobie sprawę, te obiekty będą kolorami. Mówiąc dokładniej, będą to wiele wystąpień ColorDescriptor
klasy.
1. Tworzenie ColorDescriptor
klasy
Utwórzmy klasę reprezentującą kolor. Kliknij prawym przyciskiem myszy DatabindingSampleWPF
projekt w Eksplorator rozwiązań, wybierz pozycję Dodaj / Klasa, a następnie wprowadź ColorDescriptor
jako nazwę klasy. Wybierz pozycję Dodaj , aby utworzyć klasę.
ColorDescriptor
zawiera dwie właściwości: sam kolor jako System.Windows.Media.Color
obiekt i nazwę koloru. Ma również konstruktor, który ustawia te właściwości, metodę ToString()
, która wyświetla nazwę koloru i wartości szesnastkowy dla składników kolorów R, G i B. Oto cała ColorDescriptor
klasa.
using System.Windows.Media;
namespace DatabindingSampleWPF
{
public class ColorDescriptor : ObservableObject
{
public ColorDescriptor(Color color, string name)
{
Color = color;
Name = name;
}
public Color Color { get; private set; }
public string Name { get; private set; }
public override string ToString()
{
return $"{Name} (#{Color.R:X2}{Color.G:X2}{Color.B:X2})";
}
}
}
Zastąp domyślną zawartość ColorDescriptor.cs
pliku poprzednim kodem.
2. Tworzenie strony ColorList.xaml
Aby wyświetlić listę kolorów, użyjemy nowego pliku XAML. Kliknij prawym przyciskiem myszy DatabindingSampleWPF
projekt w Eksplorator rozwiązań, a następnie wybierz polecenie Dodaj/Nowy element. Wybierz pozycję Okno (WPF) z listy dostępnych elementów, a następnie wprowadź ColorList
jako nazwę. Wybierz pozycję Dodaj , aby utworzyć stronę.
3. Ustawianie startowego pliku XAML
Teraz, jeśli uruchomisz aplikację, zostanie ona otwarta w systemie MainWindow. Ponieważ będziesz pracować z nowo utworzonym ColorList.xaml
elementem , warto mieć ten ekran podczas uruchamiania. Aby to się stało, otwórz plik App.xaml
i znajdź StratupUri
atrybut elementu głównego Application
.
StartupUri="MainWindow.xaml"
Zastąp ciąg MainWindow
ciąg , ColorList
a następnie sprawdź, czy lista ColorList jest wyświetlana podczas uruchamiania aplikacji (naciśnij klawisz F5 lub wybierz pozycję Debuguj / Rozpocznij debugowanie).
4. Utwórz DataContext
listę kolorów
Będziemy kontynuować wcześniej wprowadzone najlepsze rozwiązanie dotyczące tworzenia oddzielnej DataContext
klasy dla nowego okna XAML. Dlatego utworzymy nową klasę o nazwie ColorListDataContext
.
Kliknij prawym przyciskiem myszy DatabindingSample
projekt w Eksplorator rozwiązań, wybierz pozycję Dodaj / Klasa, a następnie wprowadź ColorListDataContext
jako nazwę klasy. Wybierz pozycję Dodaj , aby utworzyć klasę, i wklej następujący kod do pliku:
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Windows.Media;
namespace DatabindingSampleWPF
{
public class ColorListDataContext: ObservableObject
{
public List<ColorDescriptor> LotsOfColors { get; private set; }
public ColorListDataContext()
{
LotsOfColors = new List<ColorDescriptor>
{
new ColorDescriptor(Colors.Red, "red"),
new ColorDescriptor(Colors.White, "white"),
new ColorDescriptor(Colors.Green, "green"),
new ColorDescriptor(Colors.Yellow, "yellow"),
new ColorDescriptor(Colors.Blue, "blue"),
new ColorDescriptor(Colors.Black, "black")
};
}
}
}
Klasa ColorListDataContext
jest bardzo prosta (na razie). Ma właściwość o nazwie LotsOfColors
, która jest obiektem List
ColorDescriptor
. Lista jest wypełniona kilkoma kolorami w konstruktorze klasy. To wszystko.
5. Wyświetlanie kolorów w obiekcie ListBox
Następnym krokiem jest wyświetlenie kolorów w naszej aplikacji. Tak jak wcześniej, musimy utworzyć wystąpienie ColorListDataContext
klasy w ColorList.xaml
pliku i ustawić je jako DataContext
dla całego okna. ColorList.xaml
Otwórz plik i dodaj go bezpośrednio po tagu<Window ...>
:
<Window.DataContext>
<local:ColorListDataContext/>
</Window.DataContext>
Musisz w tym momencie skompilować kod, aby projektant XAML mógł rozpoznać nowo zdefiniowaną ColorListDataContext
klasę.
Następnie skopiuj następujący znacznik XAML wewnątrz tagu <Grid>
:
<ListBox ItemsSource="{Binding LotsOfColors}"
Margin="20"
Width="200"
HorizontalAlignment="Left"
VerticalAlignment="Top"/>
Interesującą ItemsSource
częścią jest atrybut . Jak sugeruje nazwa, dostarcza źródło elementów wyświetlanych w pliku ListBox
. I jest to po prostu powiązane z właściwością ColorListDataContext
LotsOfColors
".
Jeśli teraz uruchomisz aplikację, będzie ona wyświetlać kolory w programie ListBox
! Ale to nie jest zbyt miłe, aby spojrzeć na. Wydaje ListBox
się, że wywołano metodę ToString()
ColorDescriptor
s przechowywaną na LotsOfColors
liście.
6. Zdefiniuj szablon dla elementów
Warto mieć szablon, który pokazuje rzeczywisty kolor przechowywany we ColorDescriptor.Color
właściwości i jego nazwie. Coś takiego:
Aby kodować to w języku XAML, możemy umieścić kolor i Rectangle
znak TextBlock
w obiekcie StackPanel
.
<StackPanel Orientation="Horizontal">
<Rectangle Width="80" Height="20">
<Rectangle.Fill>
<SolidColorBrush Color="Blue"/>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="blue" Margin="20, 10, 0, 10"/>
</StackPanel>
Jest to jedna z zalet języka XAML i powiązania danych. Prawie każda złożona wizualizacja opiera się na szablonach, które można ponownie zdefiniować. Aby użyć powyższego StackPanel
szablonu, musimy umieścić go wewnątrz elementu DataTemplate
:
<DataTemplate>
<!-- template content comes here -->
</DataTemplate>
Sposób renderowania danych w elemecie ListBox
(i wielu innych kontrolkach) jest kontrolowany przez element ItemTemplate
, który powinien zostać ustawiony na DataTemplate
powyższe. Istnieje wiele sposobów, aby to zrobić. W tej lekcji po prostu zdefiniujemy wewnątrz DataTemplate
ListBox
elementu , z następującą składnią:
<ListBox ...>
<ListBox.ItemsSource>
<DataTemplate ...>
...
</DataTemplate>
</ListBox.ItemsSource>
</ListBox>
Później zobaczysz, jak można ponownie użyć elementu DataTemplate
w wielu miejscach, definiując go jako zasób.
Teraz znaczniki dla całego ListBox
kodu wyglądają następująco (jeśli nie wykonano tej czynności, zastąp cały <ListBox>
element następującym kodem XAML):
<ListBox ItemsSource="{Binding LotsOfColors}"
Margin="20"
Width="200"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Width="80"
Height="20">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding Color}"/>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="{Binding Name}"
Margin="20, 10, 0, 10"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Należy pamiętać, że ponieważ każdy element w ListBox
obiekcie odpowiada ColorDescriptor
obiektowi, wystarczy zdefiniować powiązania wewnątrz szablonu w kontekście tej klasy.
7. Uruchamianie aplikacji
Powinna zostać natychmiast wyświetlona lista kolorów w programie Visual Studio. Aby upewnić się, że uruchom aplikację teraz, naciskając klawisz F5 lub wybierając pozycję Debuguj/Rozpocznij debugowanie w menu.
Jeśli uruchamiasz aplikację XAML w trybie debugowania, możesz skorzystać z funkcji edycji XAML na żywo. Nie musisz nawet zatrzymywać aplikacji ani naciskać przycisku Zapisz. Wystarczy zmienić kod XAML, a większość zmian zostanie natychmiast odzwierciedlona w uruchomionej aplikacji. Wypróbuj teraz. Zmień wartości Width
i Height
Rectangle
wewnątrz szablonu danych na 30, zamieniając w ten sposób prostokąty koloru na kwadraty.
Jest to nazywane Przeładowywanie na gorąco XAML i może być przydatne do dostrajania układu i animacji w aplikacji.
Podsumowanie
W tej lekcji przedstawiono podstawy wyświetlania wielu elementów w obiekcie ListBox
. Istnieją inne mechanizmy kontroli dostępne do podobnych celów, takie jak ItemsControl
, ListView
i GridView
. Jednak podstawowe zasady są takie same: powiąż listę (IEnumerable
, List<>
) obiektów z ItemsSource
właściwością i zdefiniuj element , DataTemplate
aby kontrolować sposób wyświetlania i zachowania poszczególnych elementów listy. Można również ponownie zdefiniować układ tych elementów, a nawet wygląd samych kontrolek kontenera (chociaż wykracza to poza zakres tego modułu).
Należy pamiętać, że kod logiki nigdy nie wiedział o kontrolce ListBox
. Właśnie utworzono kolekcję obiektów biznesowych (ColorDescriptor
), a środowisko uruchomieniowe XAML obsługiwało renderowanie szablonu dla każdego elementu.
W następnej lekcji pokazano, jak można wybrać elementy z elementu ListBox
lub ComboBox
, i zmienić zawartość list z kodu, tak aby dodawanie i usuwanie elementów zostało odzwierciedlone w interfejsie użytkownika.