Обновление представления WPF при обновлении элементов атрибута Entity Framework [NotMapped] - PullRequest
0 голосов
/ 04 октября 2018

В моем классе Entity Framework есть следующее:

public int NumberOfIndividualEngagements { get; set; } 
public int NumberOfGroupEngagements { get; set; } 

[NotMapped]
public int TotalAudienceReached => NumberOfIndividualEngagements + NumberOfGroupEngagements != 0 ? NumberOfIndividualEngagements + NumberOfGroupEngagements : 0;

В представлении у меня есть TextBlock со ссылкой на TotalAudienceReached в качестве текста.У меня также есть текстовые поля для двух элементов в уравнении.Кажется, что когда я обновляю одну из двух переменных (NumberOfIndividualEngagements, NumberOfGroupEngagements), TotalAudienceReached не обновляется, а представление не обновляется.

Вопрос, возможно ли это вообще сделать таким образом или я могу это сделать?нужно настроить некоторые автономные свойства в моей ViewModel, которые ссылаются на эти изменения?

РЕДАКТИРОВАТЬ

Моя виртуальная машина такова:

namespace Core
{
    public class MyViewModel : BaseViewModel
    {
        #region Public Properties

        /// <summary>
        /// The Parent object
        /// </summary>
        public Parent Parent 
        {
            get => _Parent;
            set 
            {
                Parent = _Parent;
                OnPropertyChanged(nameof(Parent));
            }
        }

        private Parent _Parent;

        // Other properties...

        public MyViewModel()
        {
            // Load it...
        }
    }
}

Вот мой набор данных EF

namespace Data
{
    [Table("Parent")]
    public class Parent : BaseData
    {
        public int ParentId { get; set; }
        public int NumberOfIndividualEngagements { get; set; }             
        public int NumberOfGroupEngagements { get; set; } 
        // Other various properties (int, string, bool, etc.)

        [NotMapped]
        public int TotalAudienceReached => NumberOfIndividualEngagements + NumberOfGroupEngagements != 0 ? NumberOfIndividualEngagements + NumberOfGroupEngagements : 0;
    }
}

DataContext для View установлен в MyViewModel.

DataContext Контейнера (т. Е. Grid, Stackpanel) устанавливается равным свойству Parent в MyViewModel.

Элементы управления в контейнере привязываются к свойству класса Parent.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Нашел другой способ.Свойства NotMapped существуют для целей отчетности.Мне действительно не нужно было их использовать.Поэтому я решил создать свойство в ViewModel, чтобы Getter / Setter ссылался на свойства родительского объекта.Таким образом, элементы управления будут обновлены из свойств виртуальной машины, а затем установлены свойства в родительском элементе.

namespace Core
{
    public class MyViewModel : BaseViewModel
    {
        #region Public Properties

        /// <summary>
        /// The Parent object
        /// </summary>
        public Parent Parent { get; set; }

        public int NumberOfIndividualEngagements
        {
            get => Parent.NumberOfIndividualEngagements;
            set
            {
                Parent.NumberOfIndividualEngagements = value;
                OnPropertyChanged(nameof(NumberOfIndividualEngagements));
                OnPropertyChanged(nameof(TotalAudienceReached));
            }
        }

        public int NumberOfGroupEngagements
        {
            get => Parent.NumberOfGroupEngagements;
            set
            {
                Parent.NumberOfGroupEngagements = value;
                OnPropertyChanged(nameof(NumberOfGroupEngagements));
                OnPropertyChanged(nameof(TotalAudienceReached));
            }
        }

        // Other properties...

        public MyViewModel()
        {
            // Load it...
        }
    }
}
0 голосов
/ 04 октября 2018

Ваша ViewModel должна выглядеть примерно так

public class MyViewModel : INotifyPropertyChanged
{
    public int NumberOfIndividualEngagements 
    {
        get => _numberOfIndividualEngagements;
        set
        {
            _numberOfIndividualEngagements = value;
            OnPropertyChanged(nameof(NumberOfIndividualEngagements));
            OnPropertyChanged(nameof(TotalAudienceReached));
        }
    }
    public int NumberOfGroupEngagements 
    {
        get => _numberOfGroupEngagements;
        set
        {
            _numberOfGroupEngagements = value;
            OnPropertyChanged(nameof(NumberOfGroupEngagements));
            OnPropertyChanged(nameof(TotalAudienceReached));
        }
    }

    public int TotalAudienceReached => 
        NumberOfIndividualEngagements + NumberOfGroupEngagements != 0 
                ? NumberOfIndividualEngagements + NumberOfGroupEngagements 
                : 0;

}

Редактировать: я никогда не использовал свойство модели таким образом в моей модели представления, поэтому я не уверен насчет этого, но если вы отредактируетеребенок вашего Parent, он не может обновлять ваш View, поэтому всякий раз, когда ваши дети обновляют родителей, вы должны снова установить свойство Parent, например:

Parent = new Parent 
{
    ParentId = <your new value>,
    NumberOfIndividualEngagements = <your new value>,
    NumberOfGroupEngagements = <your new value>
}

таким образом,это вызовет OnPropertyChanged обновление вашего просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...