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>