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膨胀。 我该怎么办?
谢谢
答案 0 :(得分:1)
您必须传播PropertyChanged
的{{1}}事件,即,如果MyProduct
的{{1}}属性被更改,则订阅它并调用OnPropertyChanged(nameof(HasError))
:>
HasError