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 ) );
}
}
}