Data binding Silverlight/数据绑定/EntityRef

Data binding Silverlight/数据绑定/EntityRef,data-binding,silverlight-4.0,wcf-ria-services,Data Binding,Silverlight 4.0,Wcf Ria Services,我一直有一个数据绑定程序,我认为这是一个相当常见的情况,但我似乎找不到任何人有类似的问题-这让我觉得我错过了一些东西 简而言之,保存新的父实体后,父实体在绑定操作期间似乎无法引用EntityRef,也无法引用相关实体上的属性…。细节来了 我有一个这样的层级结构:组织有一个或多个代表,每个代表都是一个人,每个人都有零个或多个电话号码 所以组织->>代表->人员->>电话号码 我使用列表框在左侧显示代表列表,右侧显示所选代表的详细信息。我使用列表框中的选定项作为显示人员信息的网格的源 我使用的是WC

我一直有一个数据绑定程序,我认为这是一个相当常见的情况,但我似乎找不到任何人有类似的问题-这让我觉得我错过了一些东西

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

我有一个这样的层级结构:组织有一个或多个代表,每个代表都是一个人,每个人都有零个或多个电话号码

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

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

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

在每个代表中都有一个Person对象,它将我引向Person的名字和名称 姓氏(在内部,这是EntityRef发挥作用的地方)

在代表框中,我想显示代表的头衔,以及他们相关的名字和姓氏(在相关实体人员上)。因此,列表框将包含如下内容:

 <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>
头衔名字姓氏 地区经理比尔·史密斯 区域经理约翰·多伊

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服务提交更改时,我在整个提交过程中都进行了跟踪,它可以完美地更新数据库。提交操作完成后返回的提交结果看起来也不错

我已经确认,在客户端应用程序中,组织、代表和人员都正确关联

然而,当我返回列表框时,这个人的名字和姓氏都丢失了!我花了好几个小时(事实上是几天)试图确定原因,但似乎找不到跟踪Submitcallback和返回屏幕之间发生了什么的方法

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


为什么数据绑定在提交操作完成后接收空值,而在我点击selectionchanged上的断点时却接收空值。我相信这是一个时间问题——但肯定这个要求以前已经满足了

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

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

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();
        }
    }
公共类DummyConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{

返回值;//我想我理解为什么这是一个问题,但我仍然不理解为什么对很多人来说这不是一个更大的问题

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

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

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

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


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

Rus-不确定您要查找的C代码-创建对象的所有操作都有效,包括保存。提交后,我可以看到提交结果中的记录,包括Person navigation属性。当我让屏幕刷新,Person属性就会消失。您在调试输出窗口中看到任何错误吗?所有数据绑定错误都写在那里。有趣的是,我以前没有听说过。您知道如何监视绑定以了解它是否/何时丢失吗?