WPF binding of string property and Button.Content WPF binding of string property and Button.Content wpf wpf

WPF binding of string property and Button.Content


The quotes around Text in the call to the PropertyChangedEventArgs constructor are missing:

Text = "Begin";if (PropertyChanged != null)    PropertyChanged(this, new PropertyChangedEventArgs("Text"));


PropertyChanged wants to see the name of the property that has changed and not the value. Change the event invocation to:

PropertyChanged(this, new PropertyChangedEventArgs("Text")); 

and it will do the job.However I also would change the construction to

public string Text {      get{return _Text;}      protected set {           _Text = value;           if(null != PropertyChanged){                 PropertyChanged(this,new PropertyChangedEventArgs("Text"));          }        } } 

and then dont call the PropertyChanged-event from Start and End.

And to go even a step further, create invocation-methods like:

protected virtual void OnPropertyChanged(string propertyName) {    OnPropertyChanged(new PropertyChangedEventArgs(propertyName));}protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {    if (null != PropertyChanged) {        PropertyChanged(this,e);    }}

and then call them from your property-setter.


First of all, I used objectdataproviding, but it is not the object "ttt", they are two different things.

Second, PropertyChanged(this,new PropertyChangedEventArgs("Text")); "Text" is the name not the variable.

So, the code is following, may be helpful to others.

The data class:

namespace test3{    public class Test : INotifyPropertyChanged    {         string   _Text = "Begin";        public string Text        {            get{return _Text;}            protected set { _Text = value;            NotifyPropertyChanged("Text");            }        }        public void Start()        {            Text = "Begin";        }        public void End()        {            Text = "End";        }        public event PropertyChangedEventHandler PropertyChanged;        public void NotifyPropertyChanged(string propertyName)        {            if (PropertyChanged != null)            {                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));            }        }     }}

The logical cs:

  public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();            button1.DataContext=ttt;        }         Test ttt = new Test();        private void button1_Click(object sender, RoutedEventArgs e)        {            if (ttt.Text == "Begin")                ttt.End();            else                ttt.Start();        }    }}

The xaml:

<Window x:Class="test3.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:local="clr-namespace:test3"        Title="MainWindow" Height="350" Width="525" >    <Grid>        <Button Content="{Binding Path=Text,UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="121,69,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />    </Grid></Window>