TextBox.Text nie otrzymuje danych z właściwości obiektu po Binding'u

0

Witam,

próbuje utworzyć Binding wartości TextBox.Text do właściwości obiektu, który tworzę w "code behind". Wydaje mi się, że zrobiłem wszystko co potrzeba:

  • klasa GUI impelementuje INotifyPropertyChanged
  • przy ustawianiu właściwości wywołujemy NotifyPropertyChanged z jej nazwą
  • Binding Path ustawiony na obiekt.właściwość

Ale niestety nie działa. O czymś zapomniałem/nie wiem?

XAML:

<Window x:Class="SimpleBinding01.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"
        mc:Ignorable="d"
        Title="MainWindow" Height="307.595" Width="520.886">
    <Grid>
        <TextBox Text="{Binding Path=gui.Current, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" Name="TB1" HorizontalAlignment="Left" Height="23" Margin="0,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Grid.Column="1"/>
        <Button Name="B1" Content="Button" HorizontalAlignment="Left" Margin="168,9,0,0" VerticalAlignment="Top" Width="75" Grid.Column="1" Click="B1_Click"/>
        <Button Name="B2" Content="Button" HorizontalAlignment="Left" Margin="267,9,0,0" VerticalAlignment="Top" Width="75" Grid.Column="1"/>

    </Grid>
</Window>

Kod:

using System.Windows;
using System.ComponentModel;

namespace SimpleBinding01 {
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window {

        public GUI gui { get; set; }

        public MainWindow() {
            InitializeComponent();
            var gui = new GUI {
                Current = "BG2",
                ChangeTo = "SoD"
            };
            DataContext = gui;
        }
        
        private void B1_Click( object sender, RoutedEventArgs e )
        {
            DataContext = gui;
            gui.Current = "asd";
            gui.ChangeTo = "zxc";
        }
    }

    public class GUI : INotifyPropertyChanged {
 
        private string _current;
        private string _changeto;
        public string Current {
            get => _current;
            set {
                _current = value;
                NotifyPropertyChanged( "Current" );
            }
        }

        public string ChangeTo {
            get => _changeto;
            set {
                _changeto = value;
                NotifyPropertyChanged( "ChangeTo" );
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged( string propertyName ) {
            PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( propertyName ) );
        }
    }
 }

2

DataContext twojego TextBox to obiekt klasy Gui, który nie zawiera w sobie właściwości o nazwie gui.Current - po prostu musisz odwołać się do samego Current:

<TextBox Text="{Binding Path=Current}" />
0

Rzeczywiście pomogło. Dzięki. Wiedziałem, że to coś prostego. Przy okazji zapytam o kolejną zapewne prostą rzecz:
w poniższym kodzie:

        private void B1_Click( object sender, RoutedEventArgs e )
        {
            DataContext = gui;
            gui.Current = "asd";
            gui.ChangeTo = "zxc";
        }

chcę osiągnąć to aby naciśnięcie przycisku zmieniało właściwości obiektu zadeklarowanego w MainWindow co w konsekwencji powinno wywołać zmianę TextBox.Text. Jednak gui jest puste.
screenshot-20180521182943.png
Powinienem jakoś "przekazać" ten obiekt?

1

Obiekt gui w konstruktorze oraz w B1_Click to kompletnie dwa różne obiekty, dlatego tak to działa.

public MainWindow() {
            InitializeComponent();
            var gui = new GUI { // tutaj tworzysz nowy obiekt, zamiast używać pola o nazwie gui
            // usuń "var"
                Current = "BG2",
                ChangeTo = "SoD"
            };
            DataContext = gui;
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1