【问题标题】:Update WPF View when Entity Framework [NotMapped] attribute elements updated更新实体框架 [NotMapped] 属性元素时更新 WPF 视图
【发布时间】:2018-10-04 12:38:26
【问题描述】:

我的实体框架类中有以下内容:

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 没有更新,View 也没有更新。

问题,这是否可能以这种方式完成,或者我是否需要在我的 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;
    }
}

View 的 DataContext 设置为 MyViewModel。

Container(即 Grid、Stackpanel)的 DataContext 设置为 MyViewModel 中的 Parent 属性。

容器中的控件绑定到父类的属性。

【问题讨论】:

  • 当您在 ViewModel 中添加 INotifyPropertyChanged 时,神奇的事情发生了,对此进行一些研究,SO 中有很多内容
  • @CelsoLívero 当我将它添加到类中时,视图中没有任何更新。我也有这两个项目的 TextBlocks。我有一个“概览”面板,可以快速查看所有内容。当我添加 INotifyPropertyChanged 时,这些不再更新。
  • 再次查看我的答案,我编辑了它
  • ViewModel 是视图的专用模型。您无需使用模型 (EF),只需创建具有所需属性的 VM 并更新模型即可。
  • @Luis 是的,我就是这么做的。我回答了我自己的问题。不过谢谢。

标签: c# wpf entity-framework mvvm attributes


【解决方案1】:

您的 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更新你的View。

【讨论】:

  • 我是否必须为我的所有财产都这样做?如果我只对这些执行此操作,那么当这些更改发生时,我所有其他人都无法更新视图。
  • 抱歉,误读了您写的内容。我在问题中添加了更多内容。希望它能增加清晰度。
  • 是的,所有你想在更改时更新的属性都应该有它
【解决方案2】:

找到了不同的方式。 NotMapped 属性用于报告目的。我真的不需要使用它们。因此,我决定在 ViewModel 中创建一个属性,并让 Getter/Setter 引用 Parent 对象的属性。这样,控件将从 VM 属性中更新,然后在父级中设置属性。

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...
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多