jaytar
jaytar

Reputation: 113

Binding to the same property on multiple windows doesn't work

I ran into a quite confusing problem when developing a multi-window wpf application.

There are two windows, MainWindow and SecondWindow. The code of both is pretty simple: MainWindow:

<Button Content="Change Property to 5" Click="ChangeProperty" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" />

SecondWindow:

<Label Content="{Binding InstanceOfMyClass.value, NotifyOnSourceUpdated=True}"></Label>

The code behind the second Window is untouched, the code behind the first window is the following:

public partial class MainWindow : Window
{
    SecondWindow w;
    ViewModel vm;
    public MainWindow()
    {
        InitializeComponent();
        vm = new ViewModel() { InstanceOfMyClass = new MyClass() { value = 3 } };
        w = new SecondWindow() { DataContext = vm };
        w.Show();
    }

    private void ChangeProperty(object sender, RoutedEventArgs e)
    {
        vm.InstanceOfMyClass.value = 7;
    }
}

And the view model class which implements INotifyPropertyChanged:

class ViewModel : INotifyPropertyChanged
{
    private MyClass _instance;
    public MyClass InstanceOfMyClass 
    {
        get
        {
            return _instance;
        }
        set
        {
            _instance = value;
            OnPropertyChanged("InstanceOfMyClass");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
class MyClass
{
    public int value { get; set; }
}

I expected the text block to change its text to 5 when I click the button. The number "3" is correctly loaded on startup. The window also refreshes when I create a new instance of MyClass and set it as InstanceOfMyClass in my ViewModel.

But when I hit the button - or, even stranger, when I temporarily store InstanceOfMyClass, set it to null and reassign it with the saved variable - nothing happens.

Any idea why?

Thanks in advance!

Upvotes: 1

Views: 95

Answers (1)

Szabolcs D&#233;zsi
Szabolcs D&#233;zsi

Reputation: 8843

Implement INotifyPropertyChanged in MyClass and try again. In ChangeProperty you change the value property, that doesn't notify the view about the change.

Or you can also try rewriting your ChangeProperty to the following:

vm.InstanceOfMyClass = new MyClass() { value = 7 };

Both of these approaches should fix the problem as far as I can see.

Upvotes: 2

Related Questions