绑定到多个窗口上的相同属性不起作用

时间:2016-01-24 22:30:47

标签: c# wpf mvvm

在开发多窗口wpf应用程序时遇到了一个相当令人困惑的问题。

有两个窗口,MainWindow和SecondWindow。两者的代码都很简单: 主窗口:

<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>

第二个窗口后面的代码不受影响,第一个窗口后面的代码如下:

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;
    }
}

实现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; }
}

我希望文本块在单击按钮时将其文本更改为5。 启动时正确加载数字“3”。当我创建MyClass的新实例并在InstanceOfMyClass中将其设置为ViewModel时,该窗口也会刷新。

但是当我点击按钮 - 或者,甚至更奇怪的是,当我暂时存储InstanceOfMyClass时,将其设置为null并将其与已保存的变量重新分配 - 没有任何反应。

知道为什么吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

INotifyPropertyChanged中实施MyClass,然后重试。在ChangeProperty中,您更改了value属性,该属性未通知视图有关更改。

或者您也可以尝试将ChangeProperty重写为以下内容:

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

就我所见,这两种方法都应该解决问题。