【问题标题】:Custom model binding in WPF [duplicate]WPF中的自定义模型绑定[重复]
【发布时间】:2017-12-29 12:18:28
【问题描述】:

这是我的第一个问题,不仅仅是在 stackoverflow 中,而是在整个互联网中。 我有一个从 Sql 服务器数据库自动生成的带有 Entity Framework 6 EF6 模型的 wpf 项目。 我有以下课程:

public partial class SA_EMPLOYEE
{
    public int EMPID { get; set; }
    public string FIRST_NAME { get; set; }
    public string LAST_NAME { get; set; }
}

//then I added a custom property
public partial class SA_EMPLOYEE
{
    public string FULL_NAME => $"{FIRST_NAME} {LAST_NAME}";
}

我有一个绑定到myDbContext.SA_EMPLOYEE.ToList() 的列表框,并显示FULL_NAME 属性和一些绑定到所选项目的控件。

当我在列表框中显示FIRST_NAME 时,如果我在文本框中更改它,它会立即更改,而不是FULL_NAME。如果 FIRST_NAMELAST_NAME 中的任何一个已更改,则通知 FULL_NAME 的属性已更改的任何解决方法。

我看到一个类似的问题here

感谢任何可以提供帮助的人。

【问题讨论】:

  • 我不完全明白这一点。我的建议是关注INotifyPropertyChanged 接口。您可以通过自定义 T4 模板来覆盖 EF6 模型的默认行为。避免直接绑定 EF 模型并改用传输模型会更好。也许你应该看看 MVVM 模式。

标签: c# wpf binding


【解决方案1】:

您的解决方案是一个 INotifyPropertyChanged 接口。从这个link,您将找到您问题的确切解决方案。

【讨论】:

  • 谢谢,但这不是我的情况,我使用的是实体框架 6,它已经实现了通知属性。但不适用于我的扩展财产
【解决方案2】:

根据您的描述,我认为您可能应该使用MVVM pattern(如上所述)。 创建一个 ViewModel 并绑定到它而不是数据库模型。

public class EmployeeViewModel : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  public string FirstName {get;set;}
  public string LastName {get;set;}
  public string FullName => $"{FirstName} {LastName}";
}

如果您使用Fody/PropertyChanged,您将自动获得PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("FullName")); 调用,否则您必须在FirstName 和LastName 属性的集合中手动调用OnPropertyChanged。以上面的链接为例。

然后,您将列表框绑定到员工的 IObservableCollection。

您可能想研究像 PrismReactiveUI 这样的 MVVM 框架

作为旁注,我认为 FamilyName 和 GivenName 比 FirstName 和 LastName 更好,例如考虑到韩国等以姓氏为名字的国家/地区。

【讨论】:

    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多