Не удается привязать к члену модели из ViewModel - PullRequest
0 голосов
/ 22 ноября 2018

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 никогда не вызывается, поэтому он никогда не уведомляет).

Я не хочу напрямую ссылаться на конкретный экземпляр модели, поскольку представление может быть раздутос разными ViewModels.Как я могу это сделать?

Спасибо

1 Ответ

0 голосов
/ 22 ноября 2018

Вы должны распространить событие 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;
}
...