添加并显示从实体计算并自动更新的元素

本文关键字:更新 元素 计算 显示 实体 添加 | 更新日期: 2023-09-27 18:36:03

感谢您的任何帮助,很高兴在答案和评论出现时更新和编辑此问题。代码已被缩短,希望更容易阅读。

我首先尝试使用实体框架 6 数据库在 WPF 中实现 MVVM。

我目前可以检索数据,执行 CRUD 并在数据网格中根据需要显示各个列。我的视图模型实现了INotifyPropertyChanged和ICommand。

数据库中的(简化)实体模型为:

public Weight
    {
        public decimal Benchmark_Weight { get; set; }
        public decimal Security_Weight { get; set; }
    }

以及视图模型中包含的模型上的公共属性:

public ObservableCollection<Weight> Weights
        {
            get;
            private set;
        }

然后,我在视图模型的构造函数中实例化实体框架实例以检索数据并设置为本地权重。

public WeightsViewModel()
        {
            _context = new BenchMarkEntities();
            _context.Weights.Load();
            this.Weights = _context.Weights.Local;
         }

总的来说,我想显示从实体模型中的每一行计算的其他自动更新数据。基本上,Active_Weight = Security_Weight - Benchmark_Weight。

因此,例如,我将有一个包含模型中实体的数据网格,然后在同一个数据网格、另一个数据网格甚至任何将显示计算数据集合的 itemscontrol 中,当我更新数据网格中的Security_Weight或Benchmark_Weight时,它会自动更新。

我能够通过两个不同的过程最初检索和显示计算的数据。

第一个过程是向实体模型添加分部类:

public partial class Weight
    {
        public decimal ActiveWeight
        {
            get { return Security_Weight - Benchmark_Weight; }
        }
    }

然后在视图中绑定到此属性。

另一个过程是:

0.5) 我不更改实体模型。1)创建一个从实体模型中检索数据的方法:

ObservableCollection<decimal> Retrieve()
{
    ObservableCollection<decimal> temp = new ObservableCollection<decimal>();
    foreach (var item in Weights)
    {
        temp.Add(item.Security_Weight - item.Benchmark_Weight);
    }
    return temp;
}

2) 在视图模型的构造函数中调用它:

 public WeightsViewModel()
        {
            _context = new BenchMarkEntities();
            _context.Weights.Load();
            this.Weights = _context.Weights.Local;
            ActWeight2 = Retrieve();
        }

3) 分配给视图模型中的附加属性:

public ObservableCollection<decimal> ActWeight2
        {
            get;
            set;
        }

但是我可以看到第二个过程是有缺陷的,因为如果调用检索,则添加更多项目。

下面是 XAML:

UpdateSourceTrigger=PropertyChanged}"
              AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="SecurityWeight" Binding="{Binding Security_Weight}"/>
                <DataGridTextColumn Header="BenchmarkWeight" Binding="{Binding Benchmark_Weight}"/>
                <DataGridTextColumn Header="ActiveWeight" Binding="{Binding ActiveWeight}"/>
            </DataGrid.Columns>
    </DataGrid>
        <ListBox ItemsSource="{Binding ActWeight2}"/>

问题:当我进行更新时,计算的数据不会在显示屏上更新。

有关如何执行此操作的任何指导将不胜感激。

黑麦

添加并显示从实体计算并自动更新的元素

我认为最简单的方法是为Weight创建一个视图模型,然后在这个视图模型上实现INotifyPropertyChanged。然后,包含ObservableCollection的视图模型包含视图模型列表。你的 XAML 保持不变。这将允许 INPC 流向您的视图,而不会堵塞您的模型类。

包含权重"列表"的视图模型。

public class WeightsListViewModel : INotifyPropertyChanged
{
    public ObservableCollection<WeightViewModel> Weights
    {
        get;
        private set;
    }
    public WeightsListViewModel()
    {
        _context = new BenchMarkEntities();
        .Load();
        this.Weights = _context.Weights.Select(w => new WeightViewModel(w));
    }
}

包含单个权重的视图模型。

public class WeightViewModel : INotifyPropertyChanged
{
    public decimal Benchmark_Weight 
    { 
        get{ return _weight.Benchmark_Weight; } 
        set
        { 
            _weight.Benchmark_Weight = value;
            OnPropertyChanged("Benchmark_Weight");
            OnPropertyChanged("ActiveWeight");
        }
    }
    public decimal Security_Weight 
    { 
        get{ return _weight.Security_Weight; } 
        set
        { 
            _weight.Security_Weight = value;
            OnPropertyChanged("Security_Weight");
            OnPropertyChanged("ActiveWeight");
        }
    }
    public decimal ActiveWeight
    {
        get { return Security_Weight - Benchmark_Weight; }
    }
    private Weight _weight;
    public WeightViewModel(Weight weight){ _weight = weight; }
}