C# 添加并显示从图元计算并自动更新的图元
感谢您的帮助,并很高兴在收到答案和评论时更新和编辑此问题。为了便于阅读,代码被缩短了 我首先尝试使用EntityFramework6数据库在WPF中实现MVVM 我目前可以检索数据、执行CRUD并在数据网格中显示所需的各个列。My viewmodel实现INotifyPropertyChanged和ICommand 数据库中的(简化)实体模型为: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; }
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添加到类中的每个属性中。我将尝试给出您的答案。