C# 添加并显示从图元计算并自动更新的图元

C# 添加并显示从图元计算并自动更新的图元,c#,wpf,entity-framework,mvvm,datagrid,C#,Wpf,Entity Framework,Mvvm,Datagrid,感谢您的帮助,并很高兴在收到答案和评论时更新和编辑此问题。为了便于阅读,代码被缩短了 我首先尝试使用EntityFramework6数据库在WPF中实现MVVM 我目前可以检索数据、执行CRUD并在数据网格中显示所需的各个列。My viewmodel实现INotifyPropertyChanged和ICommand 数据库中的(简化)实体模型为: public Weight { public decimal Benchmark_Weight { get; set; }

感谢您的帮助,并很高兴在收到答案和评论时更新和编辑此问题。为了便于阅读,代码被缩短了

我首先尝试使用EntityFramework6数据库在WPF中实现MVVM

我目前可以检索数据、执行CRUD并在数据网格中显示所需的各个列。My viewmodel实现INotifyPropertyChanged和ICommand

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

public Weight
    {
        public decimal Benchmark_Weight { get; set; }
        public decimal Security_Weight { get; set; }
    }
以及viewmodel中包含的模型的公共属性:

public ObservableCollection<Weight> Weights
        {
            get;
            private set;
        }
 public WeightsViewModel()
        {
            _context = new BenchMarkEntities();
            _context.Weights.Load();
            this.Weights = _context.Weights.Local;
            ActWeight2 = Retrieve();
        }
public ObservableCollection<decimal> ActWeight2
        {
            get;
            set;
        }
总的来说,我希望显示从实体模型中的每一行计算的其他自动更新数据。基本上,活动权重=安全权重-基准权重

例如,我有一个带有模型中实体的datagrid,然后在同一datagrid、另一个datagrid甚至任何itemscontrol中显示计算数据的集合,当我在datagrid中更新安全权重或基准权重时,它会自动更新

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

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

public partial class Weight
    {
        public decimal ActiveWeight
        {
            get { return Security_Weight - Benchmark_Weight; }
        }
    }
ObservableCollection<decimal> Retrieve()
{
    ObservableCollection<decimal> temp = new ObservableCollection<decimal>();
    foreach (var item in Weights)
    {
        temp.Add(item.Security_Weight - item.Benchmark_Weight);
    }
    return temp;
}
然后在视图中绑定到此属性

另一个过程是:

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

public partial class Weight
    {
        public decimal ActiveWeight
        {
            get { return Security_Weight - Benchmark_Weight; }
        }
    }
ObservableCollection<decimal> Retrieve()
{
    ObservableCollection<decimal> temp = new ObservableCollection<decimal>();
    foreach (var item in Weights)
    {
        temp.Add(item.Security_Weight - item.Benchmark_Weight);
    }
    return temp;
}
3) 指定给viewmodel中的其他特性:

public ObservableCollection<Weight> Weights
        {
            get;
            private set;
        }
 public WeightsViewModel()
        {
            _context = new BenchMarkEntities();
            _context.Weights.Load();
            this.Weights = _context.Weights.Local;
            ActWeight2 = Retrieve();
        }
public ObservableCollection<decimal> ActWeight2
        {
            get;
            set;
        }
公共可观测收集ActWeights 2
{
得到;
设置
}
但是我可以看到第二个过程是有缺陷的,因为如果调用Retrieve,那么就添加更多的项

以下是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}"/>
UpdateSourceTrigger=PropertyChanged}
AutoGenerateColumns=“False”>
问题:当我进行更新时,显示屏上的计算数据不会更新

任何关于如何做到这一点的指导都将不胜感激


Rye

我认为最简单的方法是为
Weight
创建一个viewmodel,然后在此viewmodel上实现
INotifyPropertyChanged
。包含
ObservableCollection
的viewmodel随后包含一个viewmodels列表。XAML保持不变。这将允许INPC在不阻塞的情况下流向视图把你的模型课提高一点

包含权重“列表”的viewmodel

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));
    }
}

您的计算属性肯定是正确的选择。当您更改
SecurityWeight
BenchmarkWeight
时,
ActiveWeight
的值没有更新,这是您的问题吗?@Shoe是的。部分不清楚的问题是如何或在何处绑定,以便对Security\u Weight和Benchmark\u Weight所做的更改不受影响E以活动权重显示。感谢您的回答。在我继续调查该问题时,我发现了一个名为PropertyChanged.Fody的NuGet包。这会将INotifyPropertyChanged添加到自动生成的类中,并将OnPropertyChanged添加到类中的每个属性中。我将尝试给出您的答案。