我有一个 WPF 应用程序(MVVM Toolkit),其数据模型是使用数据库中的 EFcore 工具搭建的。一个特定类别的最终模型如下所示:
public partial class BomLine
{
public int Id { get; set; }
public int ProjectId { get; set; }
public string? Manufacturer { get; set; }
public string? ManufacturerPartNumber { get; set; }
public string? InternalPartNumberSelected { get; set; }
}
此类项目的列表
ObservableCollection<BomLine>
显示在ListView
中。这按预期工作。 InternalPartNumberSelected
的值有一个额外的绑定,它为相应的线提供了不同的颜色。
现在,当
InternalPartNumberSelected
的值发生变化时,不会触发 PropertyChanged 事件(当然,没有 [ObservableProperty]
或其他显式的 RaisePropertyChanged 命令。
我现在可以将脚手架数据更改为
public partial class BomLine : ObservableObject
{
public int Id { get; set; }
public int ProjectId { get; set; }
public string? Manufacturer { get; set; }
public string? ManufacturerPartNumber { get; set; }
[ObservableProperty] string? _internalPartNumberSelected;
}
这将使颜色变化可见,因为现在触发了属性更改事件并且重新评估了绑定。
然而,这似乎是一个糟糕的解决方案,因为它需要修改脚手架数据(这将被覆盖)。
这个问题有“正确”的方法吗?我正在使用 .net core 8 / efcore 8、WPF、MVVM 工具包。
您可以使用https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/observableobject#wrapping-a-non-observable-model中介绍的方法将 EF 与视图模型分离。在你的情况下,它会是这样的:
public class BomLineViewModel : ObservableObject
{
private readonly BomLine model;
public BomLineViewModel(BomLine model)
{
this.model = model;
}
public int Id
{
get => model.Id;
// no setter, Id is readonly
}
public int ProjectId
{
get => model.ProjectId;
set => SetProperty(model.ProjectId, value, model, (m, v) => m.ProjectId = v);
}
public string? Manufacturer
{
get => model.Manufacturer;
set => SetProperty(model.Manufacturer, value, model, (m, v) => m.Manufacturer = v);
}
public string? ManufacturerPartNumber
{
get => model.ManufacturerPartNumber;
set => SetProperty(model.ManufacturerPartNumber, value, model, (m, v) => m.ManufacturerPartNumber = v);
}
public string? InternalPartNumberSelected
{
get => model.InternalPartNumberSelected;
set => SetProperty(model.InternalPartNumberSelected, value, model, (m, v) => m.InternalPartNumberSelected = v);
}
}
这样您甚至可以向视图模型添加其他内容,并且它们不会影响 EF。