Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

INotifyPropertyChanged problem

At first I want to say that sample below is oversimplification. Suppose you have bound WPF control.

<Window Title="Window1" Height="300" Width="300">
<Grid>
    <StackPanel>
        <TextBox Text="{Binding Name}" Margin="10"/>
        <Button HorizontalAlignment="Center" 
        Content="Click Me" Margin="5" 
        Padding="2" Click="OnButtonClick" />
    </StackPanel>
</Grid>
</Window>

Window is bound to the Person class which implements INotifyPropertyChanged and has Name setter in form

    public string Name 
    {
        get { return _name; }
        set 
        {
            _name = "Some Name";
            OnPropertyChanged("Name");
        }
    }

I.e. _name is assigned "Some Name" whenever user tries to change it from UI. But this sample does not works. I changed name in TextBox to some value press tab forcing focus to move to the Button and value in TextBox remains unchanged although PropertyChanged event was triggered.

Could you please explain me why it happens? As I understand PropertyChanged event forces UI to reread values from properties and display them but in my example value in databound textbox is not updated.


Again. I understand that this is poor implementation of the property and but I want to repeat that this is oversimplification. It is just a sample. But anyway, PropertyChanged signals that property was changed and should be updated but it does not.

like image 540
Oleg Avatar asked Jan 26 '09 18:01

Oleg


1 Answers

The PropertyChanged event is ignored by the TextBox because it is the initiator of the event.

Some clarification:

The TextBox (or the binding on the textbox) knows it is the initiator because it receives the PropertyChanged event in the same call. By doing an asynchronous call, the textbox (or binding) has no way to know that it is the initiator, so it will process the event as if someone else has updated it

If you add a 2nd textbox to your UI, you'll see that the 2nd TextBox does change when you edit the 1st, and the other way around.

like image 185
Bubblewrap Avatar answered Nov 12 '22 19:11

Bubblewrap