我的silverlight项目中有一个特殊价格查找窗口,该窗口绑定到特价价格表。我在该表中有产品代码和价格。我想显示datagrid中每个代码的产品名称。与代码对应的产品名称位于另一个名为products的表中。我尝试过使用IValueConverter。由于Linq查询是异步执行的,因此我无法返回值
string ProductName = "";
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string ProdCode = value.ToString();
var GetProdNamesQuery = GV.dbContext.Load(GV.dbContext.GetProdNamesQuery(ProdCode));
GetProdNamesQuery.Completed += new EventHandler(GetProdNamesQuery_Completed);
return ProductName;
}
void GetProdNamesQuery_Completed(object sender, EventArgs e)
{
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
我能解决这个问题吗?
答案 0 :(得分:1)
您需要将产品名称作为原始查询的一部分返回。
如果你使用Linq to SQL(你的问题不清楚),在你的数据源中你需要这样的东西:
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<SpecialPrice>(p => p.Product);
this.DataContext.LoadOptions = options;
var query = from specialPrice in DataContext.SpecialPrices
select party;
return query;
只要您使用Product
属性标记属性,这将通过SpecialPrice
类的[Include]
字段返回产品信息。
然后在您的网格中,您可以简单地拥有一个与产品名称绑定的列,如下所示:
<grid:TextColumn Key="Product.ProductName" ... />
答案 1 :(得分:0)
将异步执行代码放入新属性的getter中,然后使用
Myvalue="{Binding IsAsync=true, MyViewModelProperty}"
public string MyViewModelProperty {
get {
////your converter code in synchronous pattern.
}
}
因此,您的绑定将在其自身上异步调用getter,并在可用时将其显示为n。
确保不调用在getter中完成的查询,因为这会使其异步。 getter 具有同步。
答案 2 :(得分:0)
如果你正在使用EF + WCF RIA,你可以[Include]
名称属性,而在xaml中直接绑定它。