问题
I generated this class using SQLMetal.exe. It is very bindable at runtime, but if I use this class at design time, all of my design time blend bindings are busted.
I am using the MVVM-Light framework and I am building an app for WP7.
If I extract an interface for this class, and create a simple POCO that implements this interface and I use my simple poco in my design time data source, all of the bindings come alive.
Here is the class that was generated by SQLMetal.exe.
[Table(Name="InspectionGroup")]
public partial class InspectionGroup : INotifyPropertyChanging, INotifyPropertyChanged, IInspectionGroup
{
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _InspectionGroupId;
private string _GroupName;
private System.DateTime _DateCreated;
private EntitySet<InspectionHeader> _InspectionHeaders;
private EntitySet<InspectionPoint> _InspectionPoints;
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnInspectionGroupIdChanging(int value);
partial void OnInspectionGroupIdChanged();
partial void OnGroupNameChanging(string value);
partial void OnGroupNameChanged();
partial void OnDateCreatedChanging(System.DateTime value);
partial void OnDateCreatedChanged();
#endregion
public InspectionGroup()
{
this._InspectionHeaders = new EntitySet<InspectionHeader>(new Action<InspectionHeader>(this.attach_InspectionHeaders), new Action<InspectionHeader>(this.detach_InspectionHeaders));
this._InspectionPoints = new EntitySet<InspectionPoint>(new Action<InspectionPoint>(this.attach_InspectionPoints), new Action<InspectionPoint>(this.detach_InspectionPoints));
OnCreated();
}
[Column(Storage = "_InspectionGroupId", AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
public int InspectionGroupId
{
get
{
return this._InspectionGroupId;
}
set
{
if ((this._InspectionGroupId != value))
{
this.OnInspectionGroupIdChanging(value);
this.SendPropertyChanging();
this._InspectionGroupId = value;
this.SendPropertyChanged("InspectionGroupId");
this.OnInspectionGroupIdChanged();
}
}
}
[Column(Storage = "_GroupName", DbType = "NVarChar(100) NOT NULL", CanBeNull = false)]
public string GroupName
{
get
{
return this._GroupName;
}
set
{
if ((this._GroupName != value))
{
this.OnGroupNameChanging(value);
this.SendPropertyChanging();
this._GroupName = value;
this.SendPropertyChanged("GroupName");
this.OnGroupNameChanged();
}
}
}
[Column(Storage = "_DateCreated", DbType = "DateTime NOT NULL")]
public System.DateTime DateCreated
{
get
{
return this._DateCreated;
}
set
{
if ((this._DateCreated != value))
{
this.OnDateCreatedChanging(value);
this.SendPropertyChanging();
this._DateCreated = value;
this.SendPropertyChanged("DateCreated");
this.OnDateCreatedChanged();
}
}
}
[Association(Name = "FK_InspectionHeader_InspectionGroup", Storage = "_InspectionHeaders", ThisKey = "InspectionGroupId", OtherKey = "InspectionGroupId", DeleteRule = "CASCADE")]
public EntitySet<InspectionHeader> InspectionHeaders
{
get
{
return this._InspectionHeaders;
}
set
{
this._InspectionHeaders.Assign(value);
}
}
[Association(Name = "FK_InspectionPoint_InspectionGroup", Storage = "_InspectionPoints", ThisKey = "InspectionGroupId", OtherKey = "InspectionGroupId", DeleteRule = "CASCADE")]
public EntitySet<InspectionPoint> InspectionPoints
{
get
{
return this._InspectionPoints;
}
set
{
this._InspectionPoints.Assign(value);
}
}
public event PropertyChangingEventHandler PropertyChanging;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void SendPropertyChanging()
{
if ((this.PropertyChanging != null))
{
this.PropertyChanging(this, emptyChangingEventArgs);
}
}
protected virtual void SendPropertyChanged(String propertyName)
{
if ((this.PropertyChanged != null))
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private void attach_InspectionHeaders(InspectionHeader entity)
{
this.SendPropertyChanging();
entity.InspectionGroup = this;
}
private void detach_InspectionHeaders(InspectionHeader entity)
{
this.SendPropertyChanging();
entity.InspectionGroup = null;
}
private void attach_InspectionPoints(InspectionPoint entity)
{
this.SendPropertyChanging();
entity.InspectionGroup = this;
}
private void detach_InspectionPoints(InspectionPoint entity)
{
this.SendPropertyChanging();
entity.InspectionGroup = null;
}
}
回答1:
Just had the same problem - I believe INotifyPropertyChanging stuff is not supported at desigtime, as this interface is designed to make life easier on the database. As there is no DB at designtime, the whole thing fail not letting you work in Blend (or in my case VS xaml visual editor)
Commenting out PropertyChanging implementation fixes the problem. Of course some sort of pre-processor IFDEF would be better, but no idea on that part.. I just comment the code
回答2:
Because at design time no calls to databases, async services, etc. are made. Use the ViewModel's IsInDesignModeStatic
property to determine when you are in design time or run time mode.
In run time you call your service to retrieve the data. In design time you can simulate your service and add some objects to your collection or create your data context yourself, so that you can better design you UI. However, this is not strictly necessary but it is what "Blendability" usually refers to.
There are samples at Laurent's web site and his MIX 10 video also drives home this point.
See also this post on having the same problem with an async call.
Sample (nicked form Daniel but common knowledge:
MainViewModel()
{
if(!IsInDesignMode)
{
//pull data from service
}
}
来源:https://stackoverflow.com/questions/8365691/can-anyone-think-of-why-using-this-particular-class-in-a-design-time-data-source