无法从ViewModel绑定到模型的成员

时间:2018-11-22 11:03:52

标签: c# wpf mvvm data-binding inotifypropertychanged

MyProduct是具有可更改的HasError布尔属性(具有OnPropertyChanged ...)的模型。 MyProductDialogViewModel是:

class ProductDialogViewModel : Notifier
{
    public ProductDialogViewModel() { }        
    public MyProduct Product { get; set; }               
    public bool HasError
    {
        get { return Product.HasError; }
    }
}

我已将MyProductDialogViewModel实例分配给BaseContentControl.DataContext来膨胀ContentControl。 可以使用模板绑定为所有具有HasError属性的不同ViewModel扩展此View。

<ContentControl x:Name="BaseContentControl" Content="{Binding}" ... >

然后,我尝试直接从其DataContext中提取信息。 这不起作用:

<Label Content="{Binding ElementName=BaseContentControl, Path=DataContext.HasError}"/>

但这很好用。

<Label Content="{Binding ElementName=BaseContentControl, Path=DataContext.Product.HasError}"/>

我坚信在ViewModel中这可能是一个通知问题,所以我更改为:

class ProductDialogViewModel : Notifier
{
    public ProductDialogViewModel() { }

    public MyProduct Product { get; set; }        

    public bool HasError
    {
        get { return Product.HasError; }
        set
        {
            if (Product.HasError != value)
            {
                Product.HasError = value;
                OnPropertyChanged("HasError");
            }
        }
    }
}

但无济于事(实际上从未调用过set方法,因此也从未通知过)。

我不想直接引用特定的Model实例,因为View可以使用不同的ViewModel膨胀。 我该怎么办?

谢谢

1 个答案:

答案 0 :(得分:1)

您必须传播PropertyChanged的{​​{1}}事件,即,如果MyProduct的{​​{1}}属性被更改,则订阅它并调用OnPropertyChanged(nameof(HasError))

HasError