ITnetwork Flashka zdarma C# týden
Akce! Pouze tento týden sleva až 80 % na kurzy C# .NET. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: WPF Binding

Aktivity (4)
Avatar
Vadym Stižko:17.11.2018 12:23

Dobrý den,
jsem začátečník ve WPF a teprve jsem se začal učit Binding, tak prosím berte ohled :).

Chtěl bych vypsat proměnnou do labelu/textblocku. Našel jsem několik návodů, ale stále nevím, co dělám špatně.

Moc děkuji.

Zkusil jsem: XML:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid Margin="10">
        <Label Content="{Binding Path=Label2}" Margin="0,10,0,10"/>
        <TextBlock Text="{Binding Path=TxtBlock1}" Margin="0,30,0,10"/>
    </Grid>
</Window>

Code behind:

private const string HelloMessage = "Hello World";
private List<int> NumberMessage = new List<int> { 4, 5 };
public string Label2 { get { return HelloMessage; } }
public List<int> TxtBlock1 { get { return NumberMessage; } }
public MainWindow()
{
    InitializeComponent();
}
 
Odpovědět 17.11.2018 12:23
Avatar
vosa53
Člen
Avatar
Odpovídá na Vadym Stižko
vosa53:17.11.2018 16:52
  • oknu není nastaven DataContext (property říkající odkud bindovat), v tomto případě by to bylo okno samotné
  • u té property TxtBlock1 nesedí datové typy (TextBlock.Text je string a TxtBlock1 je List<int>), dá se použít konverter https://www.wpftutorial.net/…verters.html
  • pokud se má nějaká property v objektu DataContextu nebo objektech v něm vnořených v průběhu času měnit, musí objekt ji obsahujíci implementovat rozhraní INotifyProper­tyChanged, aby tak mohl informoval binding engine o změně
  • když je ta property kolekce která se může časem měnit musí implementovat INotifyCollec­tionChanged, dá se použít například ObservableCollec­tion<T>

Nejjednodušší přiklad je třeba toto:

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="400" WindowStartupLocation="CenterScreen">
    <StackPanel>
        <ListBox ItemsSource="{Binding Colors}" SelectedValue="{Binding SelectedColor}"/>
        <TextBlock Text="Selected color is:"/>
        <TextBlock Text="{Binding SelectedColor}"/>
    </StackPanel>
</Window>

public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<string> Colors { get; }
        public string SelectedColor
        {
            get => _selectedColor;
            set
            {
                _selectedColor = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedColor)));
            }
        }

        private string _selectedColor;

        public MainWindow()
        {
            Colors = new ObservableCollection<string>() { "Red", "Green", "Blue", "Black", "White" };
            SelectedColor = Colors[0];
            DataContext = this;

            InitializeComponent();
        }
    }

Později doporučuji se podívat na MVVM, což je ve WPF často používaný návrhový vzor řešící základní členění kódu aplikace.

Editováno 17.11.2018 16:53
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 17.11.2018 16:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.