IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.
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í
+2,50 Kč
Ř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.