【问题标题】:How to bind WCF RIA Services query entity to the WPF label?如何将 WCF RIA 服务查询实体绑定到 WPF 标签?
【发布时间】:2011-10-18 13:34:45
【问题描述】:

我真的很想知道为什么在第一种情况下我可以将数据绑定到 DataGrid,而在第二种情况下它根本不起作用。谢谢你的任何线索!!!

代码如下:

        Guid id = Guid.Parse("BCBBF129-30ED-400B-9D63-403ED79FDFC7");
        EntityQuery<Alert> alert = this._preDomainContext.GetAlertQuery(id);  
        LoadOperation<Alert> l = this._preDomainContext.Load(alert);
        dataGrid1.ItemsSource = l.Entities; // <- It works fine

        label1.Content = l.Entities.ElementAt(0).Message; // It gives an error

还有 XAML:

<sdk:DataGrid   AutoGenerateColumns="True" Height="100" 
HorizontalAlignment="Left" Margin="173,154,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="120" />
<sdk:Label Height="28" HorizontalAlignment="Left" Margin="194,114,0,0" Name="label1" VerticalAlignment="Top" Width="120" />

错误是:

索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引

哦!在这两种情况下,当我调试时,我都看不到 l.Entities 的任何值,以及 l.Entities.ElementAt(0).Message。但是当页面出现在 DataGrid 下时,我可以看到数据,但同时出现上述错误...

我不确定...但是是否可以在页面出现之前查看数据?根本看不到任何数据,真是难受……

更新:

    [RequiresAuthentication]
    [EnableClientAccess()]
    public class PreDomainService : LinqToEntitiesDomainService<PreEntities>
    {


    public  Alert GetAlert(Guid id)
        {
            return this.ObjectContext.Alerts.Where(a=>a.ID == id).FirstOrDefault();
        }

【问题讨论】:

  • 我只是把错误!感谢您的评论!!!!

标签: .net wpf wcf-ria-services


【解决方案1】:

我会假设您的实体集合是空的。

【讨论】:

  • 是的。它是空的......但是后来的数据怎么可能出现?你认为这是因为一些惰性绑定问题还是?
  • LoadOperation 实现 INotifyPropertyChanged,因此您的 DataGrid 绑定知道在数据出现时自行更新。 LoadOperation 的全部意义在于它是异步的。如果您想知道数据何时加载,请订阅 Completed 事件。
  • 我应该使用这样的东西吗?_preShowDomainContext.Load(alert).Completed += (alert, args) => { label1.Content = l.Entities.ElementAt(0).Message ; };
  • 我找到了解决方案。最终代码如下所示: Guid id = Guid.Parse("BCBBF129-30ED-400B-9D63-403ED79FDFC7"); EntityQuery alert = this._preDomainContext.GetAlertQuery(id); LoadOperation l = this._preDomainContext.Load(alert); l.Completed += new EventHandler(l_Completed); // 我们需要这个方法... void l_Completed(object sender, EventArgs e) { label1.Content = ((Alert(LoadOperation)sender).Entities.FirstOrDefault()).Message; }
  • 这是另一个解决方案 this._preDomainContext.Load(alert).Completed += (sender, args) => { label1.Content = (((LoadOperation)sender).Entities .FirstOrDefault()).Message; };
猜你喜欢
  • 2011-11-20
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多