WPF
Entity Framework 6.0
数据库首先,实体由TT文件生成。
我在 EntityWrapper 方面遇到了一些问题,但无法找到有关它的任何有用信息。
我有一些实体,生成时看起来像这样:
//generated code
public partial class scm_SupplierDepot : IPartsEntity, INotifyPropertyChanged
{
[...]
public virtual dms_Address dms_Address { get; set; }
}
public partial class dms_Address : IPartsEntity, INotifyPropertyChanged
{
//shortened for brevity
public System.Guid AddressId { get; set; }
public string StreetNumber { get; set; }
public string StreetName { get; set; }
public string ApartmentNumber { get; set; }
public string City { get; set; }
public string StateProvince { get; set; }
public string PostalCode { get; set; }
public string HouseName { get; set; }
public string Country { get; set; }
public string Address2 { get; set; }
public string County { get; set; }
//INotifyPropertyChanged
[..]
}
我使用接口稍微扩展了地址类:
public partial class dms_Address : IAddress { }
public interface IAddress
{
String StreetNumber { get; set; }
String StreetName { get; set; }
String ApartmentNumber { get; set; }
String Address2 { get; set; }
String City { get; set; }
String StateProvince { get; set; }
String PostalCode { get; set; }
String County { get; set; }
String Country { get; set; }
}
我从 scm_SupplierDepot 实体中获取 dms_Address 实体时遇到了一些困惑和问题。在大多数情况下,我可以将 Depot.dms_Address转换为IAddress ,并在没有任何问题的情况下使用该实体。
但是当我尝试将此对象绑定到自定义控件时,控件接收的实际对象是 EntityWrapper< dms_Address> 或 EntityWrapperWithoutRelationships< dms_Address>
我必须让我的控件的依赖属性接受对象,而不是我喜欢的 IAddress 。现在我无法使用该对象,因为不会将强制转换为 IAddress 。我甚至无法将其转换为 EntityWrapper ,因为我无法确定要包含的正确名称空间。
public static readonly DependencyProperty AddressProperty = DependencyProperty.Register("Address", typeof(object), typeof(AddressForm), new FrameworkPropertyMetadata(null, AddressChanged));
public object Address
{
get { return (object)GetValue(AddressProperty); }
set { SetValue(AddressProperty, value); }
}
有关我的自定义控件和此依赖关系属性问题的详细信息,请参阅上一个问题:WPF Custom Control: DependencyProperty never Set (on only 1 of many properties)
问题:
答案 0 :(得分:0)
我想出了如何使用Reflection做我需要的。
Type objectType = Address.GetType();
Type iAdd = objectType.GetInterface("IAddress");
if (iAdd != null)
{
PropertyInfo info = objectType.GetProperty("StateProvince");
if (info != null)
{
string currentProvince = info.GetValue(Address) as string;
if (currentProvince != newValue)
info.SetValue(Address, newValue);
}
}
我仍然难以理解为什么我会看到这种行为;如果它有界面,为什么我不能投射呢?
Type iAdd = Address.GetType().GetInterface("IAddress"); //iAdd is not null,
IAddress IA = (Address as IAddress); //IA is null
最后,我设法切换了我的代码以使所有代码不必要>。<