OnPropertyChanged没有触发嵌套类的属性

时间:2014-04-09 11:59:37

标签: c# wpf inotifypropertychanged

我在OnPropertyChanged上遇到了一些问题。

在我的观点中,我写道:

<StackPanel>
     <Label Content="{Binding TestProperty, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
     <Button Content="Click me" Click="Button_Click" />
</StackPanel>

此数据上下文是:

class MainWindowViewModel : PropertyChangedBase
{
    public string TestProperty
    {
        get
        {
            if (TestWrapperModel.Instance.TestModel == null)
                return "Test Initial String";
            return TestWrapperModel.Instance.TestModel.TestProperty;
        }
    }
}

我的TestWrapperModel只是一个实现PropertyChangedBase的简单单例包装器。

我的TestModel就像:

class TestModel : PropertyChangedBase
{
    private String _testProperty= "";

    public String TestProperty
    {
        get
        {
            return _testProperty;
        }
        set
        {
            _testProperty= value;
            OnPropertyChanged("TestProperty");
        }
    }
}

PropertyChangedBase是一个实现INotifyPropertyChanged接口的抽象类。

每当我更改TestProperty的值时,OnPropertyChanged都会触发,但UI上的标签不会显示新值(因此它始终显示&#34;测试初始字符串&#34;)。 Snoop说绑定有效。

我认为这是一个简单的问题,我只是看不出问题所在。你有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您需要将事件从子视图模型传播到父视图模型。

订阅PropertyChanged TestModel事件并在PropertyChanged课程中再举一个MainWindowViewModel事件,通知视图TestProperty属性已更改。

答案 1 :(得分:1)

它不会奏效,因为DataContext是你的MainWindowViewModel班级,而不是你的TestModel班级。当应用程序启动时,它只从TestProperty获取一次值,如果没有更改,则不会更改标签的值。

您应该在set上的TestProperty上写下MainWindowViewModel来更改您的标签。

答案 2 :(得分:0)

PropertyChanged事件在模型上触发,但您在viewmodel上绑定 。如果后者没有调用自己的PropertyChanged事件,绑定引擎就不会知道事情已经发生了变化。