13

I'm trying to simplify some code by putting the ViewModel models into the code behind and binding the DataContext as "this", but it seems to work differently, in the following example:

Why is it when the button is clicked, the TextBlock bound to "Message" does not change, even though OnPropertyChanged("Message") is called?

XAML:

<Window x:Class="TestSimple223.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <StackPanel HorizontalAlignment="Left"> <Button Content="Button" Click="button1_Click" /> <TextBlock Text="{Binding Path=Message, Mode=TwoWay}"/> <TextBlock x:Name="Message2"/> </StackPanel> </Window> 

Code Behind:

using System.Windows; using System.ComponentModel; namespace TestSimple223 { public partial class Window1 : Window { #region ViewModelProperty: Message private string _message; public string Message { get { return _message; } set { _message = value; OnPropertyChanged("Message"); } } #endregion public Window1() { InitializeComponent(); DataContext = this; Message = "original message"; Message2.Text = "original message2"; } private void button1_Click(object sender, RoutedEventArgs e) { Message = "button was clicked, message changed"; Message2.Text = "button was click, message2 changed"; } #region INotify public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } #endregion } } 

1 Answer 1

27

You haven't marked your class as being available for property change notification. Change the heading to

public partial class Window1 : Window, INotifyPropertyChanged 

Just because you implement the methods doesn't mean that WPF knows that a class supports change notification - you need to tell it by marking it with INotifyPropertyChanged. This way, the binding mechanism can identify your class as a potential update target.

Sign up to request clarification or add additional context in comments.

1 Comment

Would he not also need to set the Data Context to itself in the xaml? DataContext="{Binding RelativeSource={RelativeSource Self}}"

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.