在开发多窗口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
并将其与已保存的变量重新分配 - 没有任何反应。
知道为什么吗?
提前致谢!
答案 0 :(得分:2)
在INotifyPropertyChanged
中实施MyClass
,然后重试。在ChangeProperty
中,您更改了value
属性,该属性未通知视图有关更改。
或者您也可以尝试将ChangeProperty
重写为以下内容:
vm.InstanceOfMyClass = new MyClass() { value = 7 };
就我所见,这两种方法都应该解决问题。