目前我有一个问题,我不确定如何解决这个问题或如何找到解决方法。我有一个包含子对象的视图模型。如果我提出一个命令,我会用 new 重新初始化 ChildObject 并添加新数据。之后我的视图更新并显示新数据。有时(它不可重现)只有一个属性不再更新。如果我在父对象中为整个对象执行此操作,或者我使用 String.Empty 执行此操作,则没有区别。一个属性未更新,将保持其旧值(不会调用 get 方法)。一旦我能够得到这种行为,我就不能通过再次提出这个命令来更新它。
有人可以帮助我并知道此类行为可能发生在哪里吗?
谢谢,
编辑示例代码以使问题可见。 在这种情况下,它似乎可以工作,但我项目中的代码看起来与XAML完全相同:
<Window x:Class="WpfApplication14.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Button Click="Button_Click" Content="Text"/>
<Label Content="{Binding Path=Cls1.A}"/>
<Label Content="{Binding Path=Cls1.B}"/>
</StackPanel>
</Window>
视图模型:
using System.ComponentModel;
namespace WpfApplication14
{
class VM : INotifyPropertyChanged
{
public VM()
{
}
private int b;
public void doWork()
{
var cls2 = new Class2 { A = "XXX", B = "YYY", C = "ZZZ" };
if (b == 3)
{
cls2 = new Class2 { A = "AAA", B = "BBB", C = "CCC" };
}
if (b == 4)
{
cls2 = new Class2 { A = null, B = null, C = null };
}
b++;
if(b == 5)
{
b = 0;
}
Cls1 = new Class1(cls2);
OnPropertyChange("Cls1");
}
public Class1 Cls1 { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChange(string property)
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
}
类2:
namespace WpfApplication14
{
class Class2
{
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}
}
第一类:
using System.ComponentModel;
namespace WpfApplication14
{
internal class Class1 : INotifyPropertyChanged
{
public Class1(Class2 x)
{
setCls2(x);
}
public Class2 cls2 { get; set; }
public string A
{
get
{
return cls2.A;
}
}
//After clicking e.g. this property stayes on the old value.
public string B
{
get
{
return cls2.B;
}
}
public string C
{
get
{
return cls2.C;
}
}
private void setCls2(Class2 x)
{
cls2 = x;
OnPropertyChange("");
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChange(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
}