Přenos dat pomocí datové vazby
V této lekci se podíváme, jak můžete použít datovou vazbu pro zadávání dat, zobrazení a skrytí částí uživatelského rozhraní na základě stavu aplikace. Seznámíte se také s celým INotifyPropertyChanged
vzorem.
Pojďme naši stávající ukázku rozšířit přátelským pozdravem, který vypadá takto.
Když vyberete tlačítko Odeslat , aplikace zobrazí v horní části jednoduchý pozdrav.
1. Otevřete řešení.
Pokud nemáte sadu Visual Studio otevřenou s projektem, který jste vytvořili během poslední lekce, otevřete ho teď.
2. Vytvoření uživatelského rozhraní pro zadávání dat
Uživatelské rozhraní pro zadávání dat je jednoduché: pouze TextBlock
v TextBox
Button
jednom vodorovném rozložení uprostřed obrazovky. Nejjednodušší způsob, jak vodorovně umístit ovládací prvky, je použít , StackPanel
jako je tato.
<StackPanel HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock Margin="10"
VerticalAlignment="Center"
Text="Enter your name: "/>
<TextBox Name="tbUserName"
Margin="10"
Width="150"
VerticalAlignment="Center"/>
<Button Margin="10"
VerticalAlignment="Center" >Submit</Button>
</StackPanel>
Zkopírujte předchozí kód a vložte ho do Grid
značky MainPage.xaml pod hodiny TextBlock
.
3. Implementace a vytvoření vazby vlastnosti UserName
Pojďme se zaměřit na kód. Otevřete Soubor MainPage.xaml.cs (stisknutím klávesy F7 můžete přepnout na kód na pozadí a Shift+F7 a přepnout zpět na XAML). Vytvořte jednoduchou vlastnost s názvem UserName
.
public string UserName { get; set; }
Když se vrátíme do souboru MainPage.xaml, můžeme vytvořit datovou vazbu mezi touto nově vytvořenou vlastností a ovládacím TextBox
prvku. TextBox
Změňte ovládací prvek přidáním atributu Text
takto:
<TextBox Name="tbUserName"
Margin="10"
Width="150"
VerticalAlignment="Center"
Text="{x:Bind UserName, Mode=TwoWay}"/>
Poznámka:
Nezapomeňte si zmást a TextBlock
TextBox
ovládací prvky zde. Vypadají ve formátu XAML velmi podobně, ale pokud vytvoříte vazbu na UserName
TextBlock
textovou vlastnost místo objektu TextBox
, aplikace nebude fungovat.
V předchozím kódu jsme vytvořili obousměrnou vazbu mezi Text
vlastností TextBox
objektu a UserName
vlastností v kódu. To znamená, že kdykoli uživatel zadá text (a přesune fokus mimo TextBox
), UserName
vlastnost v kódu se změní. TextBox
Text 's je také nastaven na hodnotu uloženou UserName
ve vlastnosti při spuštění aplikace nebo kdykoliv vyvoláme NotifyPropertyChanged
událost s parametrem propertyName
"UserName"
. (V této lekci to neuděláme.)
4. Vytvoření obslužné rutiny kliknutí na tlačítko Odeslat
V návrhové ploše poklikejte na tlačítko Odeslat . Tím se automaticky vytvoří a otevře Button_Click
událost v kódu. Button_Click
není zvlášť dobrý název, takže změňte název metody na výraznější OnSubmitClicked
. Až psaní dokončíte, klikněte na žárovku OnSubmitClicked
vedle čáry. V nabídce vyberte Přejmenovat Button_Clicked na OnSubmitClicked . Vraťte se do XAML a zkontrolujte, jestli teď xaml tlačítka vypadá takto.
<Button Margin="10"
VerticalAlignment="Center"
Click="OnSubmitClicked">Submit</Button>
Když se vrátíme k kódu za kódem, zobrazíme po stisknutí tlačítka jednoduché dialogové okno. Do metody OnSubmitClicked
přidejte následující kód:
var dlg = new Windows.UI.Popups.MessageDialog($"Hello {UserName}!");
_ = dlg.ShowAsync();
Pokud syntaxi neznáte $"Hello {Username}"
, je to ekvivalent nebo "Hello " + UserName + "!"
String.Format("Hello {0}!", UserName)
. Tato stručnější a čitelnější funkce se nazývá interpolace řetězců a byla zavedena v jazyce C# 6.
Jedná se _
o proměnnou zahození . Slouží k označení, že návratová ShowAsync
hodnota metody se nepoužívá. Metoda ShowAsync
vrátí Task
objekt, což je zástupný symbol pro úkol, který bude dokončen v budoucnu. V našem případě nemusíme čekat na dokončení úkolu, abychom mohli vrátit vrácenou hodnotu.
5. Spuštění aplikace
Pojďme se podívat, co jsme zatím udělali! Spusťte aplikaci stisknutím klávesY F5 nebo Ctrl+F5. Zadejte své jméno, vyberte tlačítko Odeslat a dialogové okno by vás mělo pozdravit.
6. Implementace IsNameNeeded
vlastnosti
Pokud dialogové okno zavřete, zobrazí se položka názvu zobrazená v uživatelském rozhraní. Tohle není to, co chceme. Formulář musíme po úspěšném vyplnění skrýt. Pojďme to tedy udělat jako další krok pomocí datové vazby.
Otevřete MainPage.xaml.cs a vytvořte vlastnost, která indikuje, zda je stále nutné zadat jméno uživatele. Do třídy přidejte následující kód MainPage
:
private bool _isNameNeeded = true;
public bool IsNameNeeded
{
get { return _isNameNeeded; }
set
{
if (value != _isNameNeeded)
{
_isNameNeeded = value;
PropertyChanged?.Invoke(
this, new PropertyChangedEventArgs(nameof(IsNameNeeded)));
}
}
}
Jedná se o poměrně standardní logickou vlastnost s backing polem a výchozí hodnotou true
, dokud se nedostaneme k setter. Vlastnost setter nejprve ověří, zda je nová hodnota stejná jako stará hodnota. Pokud ano, nemusíte nic dělat. Pokud se nic nezměnilo, nechcete se vydat na zdlouhavý proces přepočítání rozložení a překreslování ovládacích prvků. Pokud se však hodnota vlastnosti změnila , musíte o tom PropertyChanged
pomocí události informovat uživatelské rozhraní.
V předchozím kódu můžete vidět standardní vzor INotifyPropertyChanged rozhraní:
- Ověřte, jestli se hodnota změnila.
- Pokud ano, nastavte novou hodnotu.
- Upozorněte uživatelské rozhraní.
Jakmile uživatelské rozhraní oznámíte (za předpokladu, že je režim vazby nastavený na OneWay
nebo TwoWay
), zavolá getter vlastnosti, přijme novou hodnotu a odpovídajícím způsobem změní uživatelské rozhraní.
7. Skrytí formuláře po výběru tlačítka Odeslat
V našem případě chceme, aby formulář pro zadání názvu byl viditelný pouze do doby, než bude vybráno tlačítko Odeslat . Pak by měla zmizet ve stejnou dobu, kdy se zobrazí zpráva s pozdravem. Pojďme metodu OnSubmitClicked
změnit přidáním tohoto kódu na začátek:
if (string.IsNullOrEmpty(UserName))
{
return;
}
IsNameNeeded = false;
Nejprve se provede rychlá kontrola, protože tady už nepřijímáme prázdné uživatelské jméno. Po zadání IsNameNeeded
jména je nastavena na false
hodnotu a aplikace pokračuje zobrazením dialogového okna zprávy. Nastavení hodnoty IsNameNeeded
vyvolá NotifyPropertyChanged
událost a upozorní uživatelské rozhraní.
Teď jsme hotovi s kódem pro skrytí uživatelského rozhraní. Pojďme se vrátit k XAML!
Na straně XAML musíme skrýt TextBlock
, TextBox
, a Button
kdy IsNameNeeded
je false. Nebo můžeme jen skrýt jejich kontejner, v StackPanel
jednom kroku. Stačí přidat Visibility
atribut do tohoto atributu StackPanel
:
Visibility="{x:Bind IsNameNeeded, Mode=OneWay}"
Spusťte aplikaci, zadejte své jméno do TextBox
pole a ověřte, že vstupní formulář skutečně zmizí, když vyberete tlačítko Odeslat .
8. Zobrazení pozdravu pomocí vazby ui-to-UI
Pojďme nahradit MessageDialog
trvalejší zobrazení: v TextBlock
levém horním rohu. Přidejte nový TextBlock
do hlavního Grid
ovládacího prvku v XAML.
<TextBlock Text="{x:Bind sys:String.Format('Hello {0}!', tbUserName.Text), Mode=OneWay}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="10"/>
Tady se děje spousta nových věcí. Pojďme rozptýlit vazbu atributu Text
!
K vyhodnocení hodnoty Text
vlastnosti TextBlock
v systému volá integrovanou String.Format
metodu s formátovacím řetězcem "Hello {0}"
. Objekt, který se má formátovat, Text
bude tbUserName.Text
(jinými slovy, vlastnost tbUserName
ovládacího prvku). Režim vazby je definován jako OneWay
, což znamená, že TextBlock
bude přijímat data z TextBox
vlastnosti 's Text
.
Tomu se říká vazba UI-to-UI, protože zdroj datové vazby i cíl jsou v uživatelském rozhraní. Abyste ho sys
viděli v akci, musíte definovat obor názvů (který obsahuje metodu System.Format
). Do kořenové Page
značky v XAML přidejte následující řádek:
xmlns:sys="using:System"
Když teď spustíte aplikaci, uvidíte, že se pozdrav aktualizuje pomocí každého keypressu. Ani nemusíte odebrat fokus z TextBox
tlačítka Odeslat nebo ho vybrat.
V reálné aplikaci by se zobrazením jména uživatele nestalo prostřednictvím vazby uživatelského rozhraní na uživatelské rozhraní. Pravděpodobně byste sváželi DisplayName
vlastnost třídy nebo něco podobného User
.
9. Skrytí pozdravu, dokud není vybráno odeslat
Stejně cool, jak vypadá, že při psaní má aktualizace pozdravu , "Dobrý den!" Text při spuštění se může zobrazit jako neprofesionální. Bylo by vhodnější, aby pozdrav TextBlock
zůstal neviditelný, dokud není vybráno tlačítko Odeslat .
Chcete-li vypočítat, zda je pozdrav viditelný, použijte metodu s názvem GetGreetingVisibility
a přidejte ji do MainPage
třídy.
public Visibility GetGreetingVisibility()
{
return IsNameNeeded ? Visibility.Collapsed : Visibility.Visible;
}
Můžete si všimnout, že při skrytí StackPanel
jsme vytvořili vazbu bool
hodnoty na Visibility
vlastnost (která má typ UIElement.Visibility
). Visibility
Vazba na bool
hodnotu je tak běžná, že Microsoft vytvořil výchozí převod mezi těmito dvěma hodnotami, a proto jsme dříve nezískuli žádné chyby převodu typů. Tento automatický převod však funguje pouze pro vlastnosti, takže GetGreetingVisibility()
metoda musí vrátit UIElement.Visibility
místo logické hodnoty.
Stejně jako u vlastností musíme událost použít PropertyChanged
k upozorňovat uživatelské rozhraní, když chceme, aby se metoda znovu vyhodnotila. Pojďme tedy tento řádek přidat na konec OnSubmitClicked
metody.
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(nameof(GetGreetingVisibility)));
Jako poslední krok ve skutečnosti proveďte vazbu přidáním Visibility
atributu do pozdravu TextBlock
. V souboru MainPage.xaml upravte TextBlock
tak, aby vypadal takto:
<TextBlock Text="{x:Bind sys:String.Format('Hello {0}!', tbUserName.Text), Mode=OneWay}"
Visibility="{x:Bind GetGreetingVisibility(), Mode=OneWay}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="10"/>
Všimněte si, že jsme do volání nemuseli přidávat žádné odkazy na GetGreetingVisibility()
obor názvů, protože je členem MainPage
samotné třídy.
Nakonec, pokud chcete přestat zobrazovat MessageDialog
, okomentujte následující řádky z OnSubmitClicked
metody.
// var dlg = new Windows.UI.Popups.MessageDialog($"Hello {UserName}!");
// dlg.ShowAsync();
Teď jste připraveni spustit aplikaci a užívat si pozdravné zprávy.
Shrnutí
V této lekci jste viděli, jak datová vazba usnadňuje přenos dat mezi uživatelským rozhraním a kódem nebo mezi dvěma prvky uživatelského rozhraní. Napsat však bylo hodně kódu, zejména při vyvolání PropertyChanged
události v setters vlastnosti. V další lekci vytvoříte pomocnou třídu, která zjednoduší používání INotifyPropertyChanged
vzoru.
V této lekci se podíváme, jak můžete pro zadávání dat použít datovou vazbu a jak zobrazit a skrýt oddíly uživatelského rozhraní na základě stavu aplikace. Seznámíte se také s úplným INotifyPropertyChanged
vzorem a dozvíte se více o DataContext
.
Pojďme naši stávající ukázku rozšířit přátelským pozdravem, který vypadá takto.
Když vyberete tlačítko Odeslat , aplikace zobrazí v horní části jednoduchý pozdrav.
1. Vytvoření objektu DataContext na úrovni okna
Pokud nemáte sadu Visual Studio otevřenou s projektem, který jste vytvořili během poslední lekce, otevřete ho teď.
V předchozí lekci jsme vytvořili vyhrazenou Clock
třídu, která se vytvořila v rámci TextBlock
zobrazené hodiny. Tato Clock
třída obsahovala obchodní logiku pro samotné hodiny. Často však potřebujete pro obrazovku zahrnout mnohem více funkcí a bylo by zdlouhavé nastavit DataContext
pro každý ovládací prvek v uživatelském rozhraní.
Naštěstí je navržený tak, DataContext
abyste ho mohli použít na celý strom XAML – nebo jen na jeho část. Klíčovým atributem DataContext
je, že je zděděný v rámci stromu XAML, ale může být přepsán v libovolném bodě pro konkrétní podstrom.
Podívejme se na to v praxi. Vytvořte novou třídu s názvem MainWindowDataContext
a ujistěte se, že třída a jeho konstruktor jsou veřejné:
namespace DatabindingSampleWPF
{
public class MainWindowDataContext
{
public MainWindowDataContext()
{
}
}
}
Nyní nastavte instanci této třídy tak, aby byla DataContext
pro celý Window
. V souboru MainWindow.xaml přidejte tento kód hned za levou Window
značku:
<Window.DataContext>
<local:MainWindowDataContext />
</Window.DataContext>
V tomto okamžiku sada Visual Studio může znamenat, že třída DatabindingSampleWPF.MainWindowDataContext
neexistuje. Důvodem je to, že projekt nebyl zkompilován od přidání této třídy. Tuto chybu můžete opravit kompilací projektu.
Pojďme se podívat, co jsme zatím udělali. Je DataContext
nastavená Window
na úrovni (root). Tato instance objektu DataContext
bude pro každý ovládací prvek uvnitř Window
. Jedinou výjimkou je TextBlock
zobrazení hodin, které již má vlastní DataContext
sadu, a tím přepsání zděděného globálního DataContext
souboru . Pokud by to TextBlock
mělo v hierarchii další ovládací prvky, ty by také dědily Clock
objekt nastavený na objektu TextBlock
DataContext
.
2. Vytvoření uživatelského rozhraní pro zadávání dat
Uživatelské rozhraní pro zadávání dat je jednoduché: pouze TextBlock
jedno , TextBox
a a Button
v jednom vodorovném rozložení uprostřed obrazovky. Nejjednodušší způsob, jak vodorovně umístit ovládací prvky, je použít , StackPanel
jako je tato.
<StackPanel HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<TextBlock Margin="10"
VerticalAlignment="Center"
Text="Enter your name:"/>
<TextBox Name="tbName"
Margin="10"
Width="150"
VerticalAlignment="Center"/>
<Button Margin="10"
VerticalAlignment="Center">Submit</Button>
</StackPanel>
Zkopírujte předchozí kód a vložte ho do Grid
značky MainPage.xaml pod hodiny TextBlock
.
3. Implementace a vytvoření vazby vlastnosti UserName
Pojďme se zaměřit na kód. Otevřete MainWindowDataContext.cs
a vytvořte novou vlastnost s názvem UserName
.
public string? UserName { get; set; }
Vrátíme se zpět MainWindow.xaml
, můžeme vytvořit datová vazba mezi UserName
vlastností a ovládacím TextBox
prvku. TextBox
Změňte ovládací prvek přidáním atributu Text
takto:
<TextBox Name="tbUserName"
Margin="10"
Width="150"
VerticalAlignment="Center"
Text="{Binding UserName, Mode=TwoWay}"/>
Poznámka:
Nezapomeňte si zmást a TextBlock
TextBox
ovládací prvky zde. Vypadají ve formátu XAML velmi podobně, ale pokud vytvoříte vazbu na UserName
TextBlock
textovou vlastnost místo objektu TextBox
, aplikace nebude fungovat.
S předchozím kódem jsme vytvořili obousměrnou vazbu mezi Text
vlastností TextBox
a UserName
vlastností v kódu. To znamená, že kdykoli uživatel zadá text (a přesune fokus mimo TextBox
), UserName
vlastnost v kódu se změní. TextBox
Text 's bude také nastaven na hodnotu uloženou UserName
ve vlastnosti při spuštění aplikace, nebo kdykoli vyvoláme NotifyPropertyChanged
událost s parametrem propertyName
"UserName"
. (V této lekci to neuděláme.)
Poznámka:
Ve WPF je režim vazby automaticky určen pro nejběžnější situace. Pokud například provádíte vazbu na Text
vlastnost , TextBox
WPF nastaví režim TwoWay
vazby ve výchozím nastavení. To znamená, že jsme mohli dokonce přeskočit určení režimu vazby zde a mohli jsme právě napsat Text={Binding UserName}
. Další informace o režimech vazeb najdete tady.
4. Vytvoření obslužné rutiny kliknutí na tlačítko Odeslat
V návrhové ploše poklikejte na tlačítko Odeslat . Tím se automaticky vytvoří událost MainWindow.xaml.cs
a Button_Click
soubor se otevře. Button_Click
není velmi popisný název, proto změňte název metody na OnSubmitClicked
. Až psaní dokončíte, klikněte na špičku šroubováku vedle OnSubmitClicked
čáry a v nabídce vyberte Přejmenovat "Button_Clicked" na "OnSubmitClicked". Vraťte se do XAML a zkontrolujte, že xaml tlačítka teď vypadá takto:
<Button Margin="10"
VerticalAlignment="Center"
Click="OnSubmitClicked">Submit</Button>
Když se vrátíme k kódu za kódem, zobrazíme po stisknutí tlačítka jednoduché dialogové okno. Přidejte vlastnost pohodlí do horní části MainWindow
třídy, která nám umožňuje snadný přístup k MainWindowDataContext
objektu, který je nastaven jako DataContext
celek MainWindow
.
private MainWindowDataContext DC => (MainWindowDataContext)DataContext;
Dále do metody přidejte následující kód OnSubmitClicked
:
MessageBox.Show($"Hello {DC.UserName}!");
Hodnota textu zadaného v objektu TextBox
je uložena MainWindowDataContext.UserName
ve vlastnosti. První řádek ukládá odkaz na MainWindowDataContext
objekt v dočasné proměnné. Druhý řádek zobrazí pole se zprávou s pozdravem.
Pokud syntaxi neznáte $"Hello {Username}"
, je to ekvivalent nebo "Hello " + UserName + "!"
String.Format("Hello {0}!", UserName)
. Tato stručnější a čitelnější syntaxe se nazývá interpolace řetězců a byla zavedena v jazyce C# 6.
5. Spuštění aplikace
Pojďme si vyzkoušet, co jsme zatím udělali! Spusťte aplikaci stisknutím klávesY F5 nebo Ctrl+F5. Zadejte své jméno, vyberte tlačítko Odeslat a dialogové okno by vás mělo pozdravit.
6. Implementace IsNameNeeded
vlastnosti
Všimněte si, že část uživatelského rozhraní pro zadání názvu se po stisknutí tlačítka Odeslat stále zobrazuje. Formulář musíme po úspěšném vyplnění skrýt. Pojďme to tedy udělat jako další krok pomocí datové vazby.
Nejprve Otevřete MainWindowDataContext.cs a proveďte MainWindowDataContext
dědění z INotifyPropertyChanged
, stejně jako jsme to udělali s Clock
třídou.
using System.ComponentModel;
public class MainWindowDataContext : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
Dále vytvořte vlastnost, která určuje, jestli je stále nutné zadat jméno uživatele. Do třídy přidejte následující kód MainWindowDataContext
:
private bool _isNameNeeded = true;
public bool IsNameNeeded
{
get { return _isNameNeeded; }
set
{
if (value != _isNameNeeded)
{
_isNameNeeded = value;
PropertyChanged?.Invoke(
this, new PropertyChangedEventArgs(nameof(IsNameNeeded)));
}
}
}
Jedná se o poměrně standardní logickou vlastnost s backing polem a výchozí hodnotou true
, dokud se nedostaneme k setter. Vlastnost setter nejprve ověří, zda je nová hodnota stejná jako stará hodnota. Pokud ano, nemusíte nic dělat. Pokud se nic nezměnilo, nechcete se vydat na zdlouhavý proces přepočítání rozložení a překreslování ovládacích prvků. Pokud se však hodnota vlastnosti změnila , musíte o tom PropertyChanged
pomocí události informovat uživatelské rozhraní.
V předchozím kódu můžete vidět standardní vzor INotifyPropertyChanged rozhraní:
- Ověřte, jestli se hodnota změnila.
- Pokud ano, nastavte novou hodnotu.
- Upozorněte uživatelské rozhraní.
Jakmile uživatelské rozhraní oznámíte (za předpokladu, že je režim vazby nastavený na OneWay
nebo TwoWay
), zavolá getter vlastnosti, přijme novou hodnotu a odpovídajícím způsobem změní uživatelské rozhraní.
7. Skrytí formuláře po výběru tlačítka Odeslat
V našem případě chceme, aby formulář pro zadání názvu byl viditelný pouze do doby, než bude vybráno tlačítko Odeslat . Pak by měla zmizet ve stejnou dobu, kdy se zobrazí zpráva s pozdravem. Pojďme metodu OnSubmitClicked
změnit přidáním tohoto kódu na začátek:
if (string.IsNullOrWhiteSpace(DC.UserName))
{
return;
}
DC.IsNameNeeded = false;
Nejprve se provede rychlá kontrola, protože tady už nepřijímáme prázdné uživatelské jméno. Po zadání IsNameNeeded
jména je nastavena na false
hodnotu a aplikace pokračuje zobrazením dialogového okna zprávy. Nastavení hodnoty IsNameNeeded
vyvolá NotifyPropertyChanged
událost a upozorní uživatelské rozhraní.
Teď jsme hotovi s kódem pro skrytí uživatelského rozhraní. Pojďme se vrátit k XAML!
Na straně XAML musíme skrýt TextBlock
, TextBox
, a Button
kdy IsNameNeeded
je false. Nebo můžeme jen skrýt jejich kontejner, v StackPanel
jednom kroku. Přidejte atribut do tohoto atributu Visibility
StackPanel
:
Visibility="{Binding IsNameNeeded, Converter={StaticResource BooleanToVisibilityConverter}}"
Tato vazba se skládá ze dvou částí. První část určuje cestu vazby, která odkazuje na IsNameNeeded
vlastnost objektu MainWindowDataContext
, který je nastaven jako DataContext
celý Window
.
IsNameNeeded
Vlastnost je ale logická hodnota, zatímco Visibility
je typu System.Windows.Visibility, což je .enum
Musíme provést převod mezi těmito dvěma. Tento převod je tak běžný, WPF má integrovanou pomocnou třídu s názvem BooleanToVisibilityConverter
. Potřebujeme vytvořit instanci této třídy a odkazovat na ni z deklarace vazby.
Vytvoříme instanci této třídy v XAML jako prostředek objektu Window
. Každá FrameworkElement
může mít svou vlastní kolekci prostředků s klíčem identifikujícím každý prostředek v kolekci. V BooleanToVisibilityConverter
předchozí vazbě je tento klíč odkazující na BooleanToVisibilityConverter
objekt uvnitř kolekce prostředků. Kolekci prostředků můžete definovat přidáním následujícího kódu do Window
počáteční značky:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Window.Resources>
Spusťte aplikaci, zadejte své jméno do TextBox
pole a ověřte, že vstupní formulář skutečně zmizí, když vyberete tlačítko Odeslat .
8. Zobrazení pozdravu pomocí vazby ui-to-UI
Pojďme nahradit MessageDialog
trvalejší zobrazení: v TextBlock
levém horním rohu. Přidejte nový TextBlock
do hlavního Grid
ovládacího prvku v XAML.
<TextBlock Text="{Binding Text, ElementName=tbName, StringFormat='Hello {0}!'}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="10"/>
V této nové TextBlock
verzi je zavedeno několik nových věcí . Pojďme rozptýlit vazbu atributu Text
!
Chcete-li vyhodnotit hodnotu Text
vlastnosti TextBlock
na , systém volá předdefinované String.Format metoda s formátovací řetězec "Hello {0}"
. Objekt, který se má formátovat, Text
bude tbName.Text
(jinými slovy, vlastnost tbName
ovládacího prvku). Režim vazby je automaticky definován jako OneWay
, což znamená, že TextBlock
bude přijímat data z TextBox
vlastnosti ' Text
s.
Tomu se říká vazba UI-to-UI, protože zdroj datové vazby i cíl jsou v uživatelském rozhraní. Pokud ji chcete zobrazit v akci, stačí aplikaci spustit. Všimněte si, jak se pozdrav aktualizuje pomocí každého keypressu. Ani nemusíte odebrat fokus z TextBox
tlačítka Odeslat nebo ho vybrat.
V reálné aplikaci by se zobrazením jména uživatele nestalo prostřednictvím vazby uživatelského rozhraní na uživatelské rozhraní. Pravděpodobně byste se sváželi s DisplayName
vlastností User
třídy nebo jiným podobným přístupem.
9. Skrytí pozdravu, dokud není vybráno odeslat
Stejně cool, jak vypadá, že při psaní má aktualizace pozdravu , "Dobrý den!" Text při spuštění se může zobrazit jako neprofesionální. Bylo by vhodnější, aby pozdrav TextBlock
zůstal neviditelný, dokud není vybráno tlačítko Odeslat .
Chcete-li vypočítat, zda je pozdrav viditelný, použijte vlastnost s názvem GreetingVisibility
a přidejte jej do MainWindowDataContext
třídy.
public Visibility GreetingVisibility => IsNameNeeded ? Visibility.Collapsed : Visibility.Visible;
Budete muset přidat System.Windows
také obor názvů do using
s in MainWindowDataContext
.
Můžete si vzpomenout, že dříve, když jsme schovávali StackPanel
, jsme sváželi bool
hodnotu s Visibility
vlastností (která má typ System.Windows.Visibility
). Pokud je však zdroj vazby již správným datovým typem, můžeme přeskočit BooleanToVisibilityConverter
.
Stejně jako předtím musíme událost použít PropertyChanged
k upozorňovat uživatelské rozhraní, když chceme, aby znovu vyhodnocovala GreetingVisibility
. Pojďme tedy tento řádek přidat na konec if
bloku v setteru IsNameNeeded
.
PropertyChanged?.Invoke(
this, new PropertyChangedEventArgs(nameof(GreetingVisibility)));
Tím se zajistí, že při každé IsNameNeeded
změně budou vyvolány dvě PropertyChanged
události: jedna pro samotnou vlastnost a jedna pro IsNameNeeded
počítanou vlastnost GreetingVisibility
, která závisí na IsNameNeeded
.
Jako poslední krok proveďte vazbu přidáním Visibility
atributu do pozdravu TextBlock
. Upravte MainWindow.xaml
ho TextBlock
tak, aby vypadal takto:
<TextBlock Text="{Binding Text, ElementName=tbName, StringFormat='Hello {0}!'}"
Visibility="{Binding GreetingVisibility}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="10"/>
Nakonec, chcete-li ukončit zobrazení MessageBox
, okomentovat následující řádek z OnSubmitClicked
metody v MainWindow.xaml.cs
.
// MessageBox.Show($"Hello {DC.UserName}!");
Teď jste připraveni spustit aplikaci a užívat si pozdravné zprávy.
Shrnutí
V této lekci jste viděli, jak datová vazba usnadňuje přenos dat mezi uživatelským rozhraním a kódem nebo mezi dvěma prvky uživatelského rozhraní. Napsat však bylo hodně kódu, zejména při vyvolání PropertyChanged
události v setters vlastnosti. V další lekci vytvoříte pomocnou třídu, která zjednoduší používání INotifyPropertyChanged
vzoru.