我看了其他类似的问题,但我无法自己解决这个问题。我目前正在使用Lightswitch的Lightswitch 12.0.3 Update 4版本和我以前版本的Lightswitch我可以轻松地做这些事情......所以我不明白改变了什么以及为什么我不能再这样做了。
我收到错误:
无法将属性或索引器“LightSwitchApplication.Report.Customer”分配给 - 它是只读的
Report
是我的屏幕,Customer
是我的桌子。所以在(屏幕)背后的代码中我试图这样做:
partial void Report_InitializeDataWorkspace(List<IDataService> saveChangesTo)
{
if (this.CustomerId.HasValue)
{
this.Customer = this.DataWorkspace.ApplicationData.Customers.Where(w => w.Id == this.CustomerId.Value).Single();
}
}
在这种情况下,CustomerId
是添加到我的屏幕的本地int属性。
现在错误是this.Customer
无法分配,因为它是只读的。
我错过了什么?
另外,我在另一个地方遇到同样的错误:
无法将属性或索引器“LightSwitchApplication.Report.NewProduct”分配给 - 它是只读的
partial void CreateNewProduct_Execute()
{
this.NewProduct = this.DataWorkspace.ApplicationData.Products.AddNew();
this.OpenModalWindow("NewProduct");
}
答案 0 :(得分:2)
我怀疑您遇到的问题与2011年初测试版和RTM版本之间的许多变化有关。
虽然我在Silverlight方面有点生疏(近年来专注于HTML 5 LightSwitch路线)但我会尝试提供一些可能有用的指示。
关于你的Report_InitializeDataWorkspace代码(我猜测它是根据传递的参数来默认this.Customer值)你应该能够解决这个问题,如下所示: -
if (this.CustomerId.HasValue)
{
var c = this.DataWorkspace.ApplicationData.Customers.Where(w => w.Id == this.CustomerId.Value).Single();
this.Customer.Name = c.Name;
this.Customer.AddressLine1 = c.AddressLine1;
}
如果您的意图不是这样,那么请您提供一些有关您尝试实施的内容的更多背景信息。
关于CreateNewProduct代码,您应该能够实现以下几行: -
partial void CreateNewProduct_Execute()
{
Product newProduct = this.DataWorkspace.ApplicationData.Products.AddNew();
this.Products.SelectedItem = newProduct;
this.OpenModalWindow("NewProduct");
}
同样,如果我误解了您的意图,请为您提供更多背景信息。
以下文章也可能对这方面有帮助(虽然它只涉及vb方法而不是c#代码): -
LightSwitch Team Blog - Creating a Custom Add or Edit Dialog (Sheel Shah)
虽然该文章大约是2011年版,但它仍应与您正在使用的2013年更新4版本相关。
答案 1 :(得分:1)
没有看到'Customer'和'NewProduct'的声明,我只能猜测你可能已经将它声明为只有Getter的属性 - 没有Setter。
如果不是这种情况,您是否可以显示更多代码来演示失败的内容。
答案 2 :(得分:0)
我解决了&#34;问题&#34; - 这是我的错,无法理解数据项作为Customer类型的查询和数据项作为Customer类型的Local Property之间的区别。
换句话说,我将Customer和Product都添加为本地屏幕成员而不是查询,现在我的代码按预期工作。