- Ukázka zjednodušené verze RelayCommandu, která jen volá metodu bez parametru pomocí delegátu.
private Action _action;
public void Execute(object parameter)
{
_action?.Invoke();
}
- Ukázka použití kolekce ObservableCollection jako typu property pro bindování, která provádí notifikaci o tom, že došlo k přidání, odebrání nebo změně všech jejich prvků.
public ObservableCollection<Student> Studenti { get; set; }
- Ukázka použití PropertyChange u položky kolekce. Pokud chceme, aby se aktualizovalo zobrazení property jednotlivých položkách kolekce, tak musí i typ položky implementovat rohraní INotifyPropertyChange, příkladem je třída Student.
- Ukázka použití atributu CommandParameter pro předávání parametrů
<Button Content="Přičti 1" Command="{Binding CommandZmena}" CommandParameter="1" />
private Action<object> _action;
public void Execute(object parameter)
{
_action?.Invoke(parameter);
}
- Ukázka použití atributu UpdateSourceTrigger tak aby se hodnota měněného textu předávala hned při editaci textu a ne až pro ztrátě fokusu
<TextBox Text="{Binding Maximum, UpdateSourceTrigger=PropertyChanged}" />
- Ukázka WPF specifické implementace implementace property CanChange v RelayCommandu, díky které můžeme zakázat provedení Commandu a u Buttonu dojde také automaticky k nastavení property IsEnabled na false.
CommandZmena = new MyCommand(Zmen, MuzeZmenit);
private bool MuzeZmenit()
{
return Pocitadlo < Maximum;
}
- Pokud dochází ke změně návratové hodnoty metody CanChange mimo UI, například s pomocí časovače, můžeme informovat tlačítko aby si zavolalo metodu CanChange a zjistilo její návratovou hodnotu.
dispatcherTimer.Tick += (sender, e) => { ++Pocitadlo; CommandZmena.OnCanExecuteChanged(); };
- Ukázka nových vlastností jazyka C# 7: Is-expressions with patterns a Out variables
if (param is string retezec)
{
if (int.TryParse(retezec, out int cislo))
{
Pocitadlo += cislo;
}
}
Studenti s pokročilymi styly. V projektu jsou ukázky následujících témat:
- Style
- Resources
- DataTemplates
Pomocí třídy Style můžeme sdílet nastavení properties (ale také resources a eventů) mezi instancemi konkrétního typu. Objekt typu Style má zadaný zázev pomocí atributu x:Name a obsahuje kolekci jednoho nebo více objektů typu Setter, kdy každý Setter má atribut Property a Value. Property je název property elementu na který chceme styl aplikovat a Value je jeho hodnota.
Objekt třídy Style se typicky přidáva do kolekce Resources kořenového elementu Window nebo Application. V následujícím příkladu jej ale pro zjednodušení přidáváme do Resources elementu StackPanel. Konkrétně vytváříme styl s názvem StyleBlue který nastaví Background a Foreground třídy TextBlock. Tento styl potom aplikujeme na dva elementy TextBlock pomocí atributu Style.
<StackPanel>
<StackPanel.Resources>
<Style x:Key="StyleBlue" >
<Setter Property="TextBlock.Background" Value="LightBlue" />
<Setter Property="TextBlock.Foreground" Value="Black" />
</Style>
</StackPanel.Resources>
<TextBlock Style="{StaticResource ResourceKey=StyleBlue}" Text="Ahoj" />
<TextBlock Style="{StaticResource ResourceKey=StyleBlue}" Text="Jak se máš" />
</StackPanel>
Pomocí atributu TargetType muzeme zapis elementu TextBlock zkrátit a místo XAML Property="TextBlock.Background"
napsat jen XAML Property="Background"
.
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock" x:Key="StyleBlue" >
<Setter Property="Background" Value="LightBlue" />
<Setter Property="Foreground" Value="Black" />
</Style>
</StackPanel.Resources>
<TextBlock Style="{StaticResource ResourceKey=StyleBlue}" Text="Ahoj" />
<TextBlock Style="{StaticResource ResourceKey=StyleBlue}" Text="Jak se máš" />
</StackPanel>
Každý element má property Resources, která obsahuje obsahuje objekty, které se pak používají na různých místech aplikace. Typickým příkladem jsou objekty typu Style, Brush a DataTemplate. Objekty se typicky přidávájí do Resources elementu Application pokud je chceme používat v celé aplikaci, nebo do Resources elementu Window, pokud je chceme používat pouze v jednom okně aplikace. Každý objekt v Resources musí mít atribut XAML x:Key
.
K přístupu k objektům v Resources potom používáme Markup Extension StaticResource nebo DynamicResource. StaticResource používáme, pokud předpokládáme, že se hodnota objektu za běhu programu nemění a stačí ho načíst jen jednou na začátku programu, například Style zůstává pořád stejný. DynamicResource potom používáme, když očekáváme, že se objekt bude v průběhu programu měnit nebo hodnota není známá před spuštění programu (například systémové barvy operačního systému).
V následujícím příkladě přidáme do Resources elementu Window objekt typu SolidColorBrush, který použijeme pro výplň objektu typu Ellipse a objekt typu Style, použijme na objekt typu TextBlock.
<Window x:Class="WpfAppStudentTemplates.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<SolidColorBrush x:Key="ModryStetec" Color="Blue" />
<Style TargetType="TextBlock" x:Key="StyleZlutePozadi" >
<Setter Property="Background" Value="LightYellow" />
</Style>
</Window.Resources>
<StackPanel>
<TextBlock Style="{StaticResource ResourceKey=StyleZlutePozadi}" Text="Ahoj" />
<Ellipse Width="30" Height="30" Fill="{StaticResource ModryStetec}"/>
</StackPanel>
</Window>
Todo:
- DataTemplate
- Conditional DataTemplate