我有一个DataBinding程序,我认为这是一个相当普遍的事件,但我似乎找不到任何有类似问题的人 - 这让我觉得我错过了什么......
简而言之,在保存新的Parent实体之后,父实体似乎无法在绑定操作期间引用EntityRef并引用相关实体上的属性....这里有细节...
我有一个层次结构,如下所示:组织有一个或多个代表,每个代表都是一个人,每个人的电话号码都是零或多个。
So Organization->>代表 - > Person->> TelephoneNumbers。
我使用列表框在左侧显示代表列表,右侧显示所选代表的详细信息。我使用ListBox中的选定项作为显示Person信息的网格的源。
我正在使用WCF RIA服务,因此我有一个名为Organization的Entity对象,其中包含一个EntitySet代表集合,我将其用作绑定到列表框的itemsource。
在每个代表中都有一个Person对象,它将我引导到Person First名称和 姓氏(在内部,这是EntityRef发挥作用的地方)。
在代表框中,我想显示代表名称,以及相关的名字和姓氏(在相关实体人员身上)。因此列表框将包含以下内容:
标题名字姓氏 区经理比尔史密斯 区域经理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服务提交更改时,我已通过提交跟踪了所有更改,并且它更新数据库的工作完美。提交结果在提交操作完成后返回,看起来也很好。
我已确认组织,代表和人员在客户端应用程序中都正确相关。
但是,当我返回列表框时,人员的名字和姓氏都丢失了!我花了几个小时(事实上几天)试图确定原因,但似乎无法找到跟踪Submitcallback和返回屏幕之间发生的事情的方法。
在我的调试中,我添加了一个SelectionChanged事件处理程序,并添加了一个断点。当我单击新保存的行,并查看Person - 它不是null,它包含正确的数据 - 但列表框显示FallBack属性。
为什么在提交操作完成后Databinding会收到一个null,但是当我在selectionchanged上点击断点时它就在那里。我确定这是一个时间问题 - 但这个要求肯定已经满足了!
答案 0 :(得分:1)
IMO你正在丢失你的bindig,我不确定但是当你的数据绑定时手动设置它的情况会发生这种情况。
答案 1 :(得分:1)
这有点棘手。为了调试绑定,我使用一个伪转换器并在下面显示的注释行放置一个断点:
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中的值如何更改,如果它没有达到break pint,则意味着您已经丢失了绑定(或者您的DataContext中没有这样的属性)
答案 2 :(得分:0)
我想我明白为什么这是一个问题,但我仍然不明白为什么对很多人来说这不是一个问题。
我使用代理键,此问题仅在提交后发生。我已经深入了解客户端DomainService模型是否在添加后正确保存此数据,我现在确信它是。
但是,我认为这是一个时间问题。必须先在父项之前将父项添加到模型中。然而,网格绑定到父级,参考导航属性来显示子级数据。在这种情况下,基数是一对一的,但一个的负荷必须发生,直到第二个的负荷。
我的想法是加载一个实体,因此属性提升。控件响应raise属性,并获取数据。但是,在加载“child”实体之前会发生这种情况,并且EntityRef导航属性返回null。然后直接加载子实体,但由于父节点上已经发生绑定,控件不会“看到”数据。
我发现如果重新绑定控件(Silverlight),一切都会显示出来。但是,在MVVM中,这是完成加载的VM与必须进行重新绑定的控件之间的紧密耦合。我已经尝试重新提升属性更改事件,但控件没有响应。
我将不得不花时间创建一个带有错误的小项目,并将其传递给技术支持部门进行澄清。