【问题标题】:Silverlight / DataBinding / EntityRefSilverlight / DataBinding / EntityRef
【发布时间】:2011-06-11 21:17:41
【问题描述】:

我一直有一个 DataBinding 程序,我认为这是一个相当普遍的情况,但我似乎找不到任何有类似问题的人 - 这让我认为我错过了一些东西..

简而言之,在保存新的父实体后,父实体似乎无法在绑定操作期间引用 EntityRef 并引用相关实体上的属性……。细节来了……

我的层次结构如下所示:组织有一个或多个代表,其中每个代表都是一个人,每个人都有零个或多个电话号码。

所以组织->>代表->人员->>电话号码。

我使用列表框在左侧显示代表列表,右侧显示所选代表的详细信息。我使用 ListBox 中的选定项作为显示人员信息的网格的源。

我正在使用 WCF RIA 服务,因此我有一个名为 Organization 的 Entity 对象,其中包含代表的 EntitySet 集合,我将其用作绑定到列表框的 itemsource。

在每个代表中都有一个 Person 对象,它引导我到 Person First name 和 姓氏(在内部这是 EntityRef 发挥作用的地方)。

在代表框中,我想显示代表头衔,以及他们相关的名字和姓氏(位于相关实体 Person 上)。所以列表框会包含这样的内容:

职务 名 姓 区域经理比尔史密斯 区域经理 John Doe

XAML 如下所示:

 <ListBox> 
   <ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>

           <Grid.ColumnDefinitions>

             <ColumnDefinition/>

             <ColumnDefinition/>

             <ColumnDefinition/>

           </Grid.ColumnDefinitions>

           <TextBlock Grid.Column="0" Text="{Binding ContactTitle}" Margin="5"/>

          <TextBlock Grid.Column="1" Text="{Binding Path=Person.FirstName, Mode=OneWay,    FallbackValue='New Representative'}" Margin="5"/>

          <TextBlock Grid.Column="2" Text="{Binding Path=Person.LastName, Mode=OneWay, FallbackValue='New Representative'}" Margin="5"/>

        </Grid>

     </DataTemplate>

  </ListBox.ItemTemplate>

</ListBox>

当我创建一个新的代表时,我还会创建一个新的人员记录,并立即将新人员与代表关联,并将代表与组织关联。

在我保存 DomainContext 之前,一切都很好。当我通过 RIA 服务提交更改时,我已经通过提交对其进行了跟踪,并且它更新了数据库,运行良好。提交操作完成后返回的提交结果看起来也不错。

我已确认 Org、Rep 和 Person 在客户端应用程序中都正确关联。

然而,当我返回列表框时,Person 的名字和姓氏都丢失了!我花了好几个小时(实际上是几天)试图确定原因,但似乎无法找到一种方法来追踪在提交回调和返回屏幕之间发生了什么。

在我的调试中,我添加了一个 SelectionChanged 事件处理程序,并添加了一个断点。当我单击新保存的行并查看 Person 时——它不为空,并且包含正确的数据——但列表框正在显示 FallBack 属性。

为什么在提交操作完成后数据绑定收到一个空值,但是当我在 selectionchanged 上命中断点时它就在那里。我确定这是一个时间问题——但肯定之前已经满足了这个要求!

【问题讨论】:

  • Rus - 不确定您要查找的 C# 代码 - 创建对象的所有内容都有效,包括保存。提交后,我可以看到提交结果中的记录,包括 Person 导航属性。当我让屏幕刷新时,Person 属性就消失了。
  • 您在调试输出窗口中看到任何错误吗?所有数据绑定错误都写在那里。

标签: data-binding silverlight-4.0 wcf-ria-services


【解决方案1】:

IMO 您正在丢失绑定,我不确定,但是当您在绑定时手动设置数据时会发生这种情况。

【讨论】:

  • 有趣 - 我以前没有听说过这个。你知道如何监控绑定以了解它是否/何时丢失?
【解决方案2】:

这有点棘手。为了调试绑定,我使用了一个假转换器并在下面显示的注释行放置一个断点:

public class DummyConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value; // <- place you break point here
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

你需要在你的 xaml 中使用它:

<Grid>
    <Grid.Resources>
        <local:DummyConverter x:Key="DummyConv"/>
    </Grid.Resources>

    <TextBlock Text="{Binding MyText,Converter={StaticResource DummyConv}}"/>
</Grid>

现在您可以看到 Converter 中的值是如何变化的,如果它没有达到中断品脱,则意味着您丢失了绑定(或者您的 DataContext 中没有此类属性)

【讨论】:

    【解决方案3】:

    我想我理解为什么这是一个问题,但我仍然不明白为什么对很多人来说这不是一个更大的问题。

    我使用代理键,这个问题只在提交后出现。我已经深入了解客户端 DomainService 模型是否在添加后正确保存了这些数据,我现在确信它是。

    但是,我认为这是一个时间问题。必须先将父级添加到模型中,然后再添加子级。然而网格绑定到父级,参考导航属性来显示子级数据。在这种情况下,基数是一对一的,但必须先加载一个,直到加载第二个。

    我的想法是加载一个实体,因此属性会提高。控件响应 raise 属性,并获取数据。然而,这发生在加载“子”实体之前,并且 EntityRef 导航属性返回 null。然后直接加载子实体,但由于绑定已经发生在父实体上,控件不会“看到”数据。

    我发现如果我重新绑定控件 (Silverlight),一切都会显示出来。然而,在 MVVM 中,这是完成负载的 VM 与必须重新绑定的控件之间的紧密耦合。我尝试重新引发属性更改事件,但控件没有响应。

    我将不得不花时间创建一个有错误的小项目,并将其传递给技术支持以进行澄清。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2013-02-18
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多