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, используя привязку шаблона.
<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 никогда не вызывается, поэтому он никогда не уведомляет).
Я не хочу напрямую ссылаться на конкретный экземпляр модели, потому что представление может быть расширено с помощью разных моделей представления. Как я могу сделать ?
Спасибо
Да, он реализует INotifypropertychanged и вызывает OnPropertyChanged ("HasError")





Вы должны распространить событие PropertyChanged для MyProduct, т.е. подписаться на него и вызвать OnPropertyChanged(nameof(HasError)), если свойство HasError для MyProduct изменяется:
public class ProductDialogViewModel : Notifier
{
public ProductDialogViewModel() { }
private MyProduct _product = null;
public MyProduct Product
{
get { return _product; }
set
{
if (_product!=null)
{
_product.PropertyChanged -= Product_PropertyChanged;
}
_product = value;
if (_product != null)
{
_product.PropertyChanged += Product_PropertyChanged;
}
}
}
private void Product_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName==nameof(MyProduct.HasError))
{
OnPropertyChanged(nameof(HasError));
}
}
public bool HasError => Product.HasError;
}
Идеально. Вы должны изменить Product_PropertyChanged в коде на ViewModel_PropertyChanged
@Beorne Готово .. :)
Реализует ли класс Prouduct INotifypropertychanged, а HasError вызывает событие OnPropertyChanged?