0

目前我有一个问题,我不确定如何解决这个问题或如何找到解决方法。我有一个包含子对象的视图模型。如果我提出一个命令,我会用 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));
            }
        }
    }
}
4

1 回答 1

0

从您的示例代码中很难看出,但我认为问题可能出在此处:

如果我提出一个命令,我会用 new 重新初始化 ChildObject 并添加新数据。

我的猜测是,当您创建 ChildObject 类的新实例时,您不会为该新实例重新连接 PropertyChanged 事件。因此,PropertyChanged 事件可能正在触发,但没有任何东西可以处理它。

于 2012-07-18T12:59:31.017 回答