【问题标题】:Cross DomainDataSource Combobox SelectedItem Binding跨域数据源组合框 SelectedItem 绑定
【发布时间】:2011-06-28 11:23:26
【问题描述】:

我对数据绑定和 XAML 还很陌生,所以这可能是相当简单的事情,但我已经被它难住了好几天(并且对谷歌搜索比我现在可以跟踪的更多感到沮丧)并且希望任何指向正确方向的指针。我唯一的偏好是尽可能将其保留在纯 XAML 中。

在我的 RIA SL4 项目中,我有两个实体 PackageOSOS,其中 PackageOSOSPackageOS.OS 关联(通过 PackageOS.OSID 关联 OS.ID - 和 @ 987654328@ + .Include() 在相关部分正确设置)

这是我在 DataForm 中使用的模板(在 Page.Resource 部分以及所有其他涉及的 DDS 中定义)以获取 OSEntities 列表以绑定到 PackageOS 实体(来自 RIA GetOSEntities() 使用 DDS) :

<DataTemplate x:Key="POSItemTemplate">
    <StackPanel>
        <toolkit:DataField Label="PackageOS.OS">
            <TextBlock Text="{Binding Source={StaticResource packageOSEntityDomainDataSource}, Path=Data.CurrentItem.OS}" />
        </toolkit:DataField>
        <toolkit:DataField Label="OS">
            <ComboBox ItemsSource="{Binding Path=Data, Source={StaticResource osEntityDomainDataSource}}"
                      SelectedItem="{Binding Path=Data.CurrentItem.OS, Source={StaticResource packageOSEntityDomainDataSource}}"/>
        </toolkit:DataField>
    </StackPanel>
</DataTemplate>

核心问题是ComboBoxSelectedItem 不起作用。所有绑定都可以从 IDE 绑定向导访问,因此我输入不正确的路径不是问题。我可以看到packageOSEntityDomainDataSource.Data.CurrentItem 的类型是PackageOS

如果我在后端数据库中创建手动条目,结果会显示在 PackageOS.OS 文本块中,所以我知道它已正确返回但 SelectedItem 拒绝选择它(它最终选择下拉列表中的第一个值不管OS 中的PackageOS 中的项目)。

非常感谢!

【问题讨论】:

    标签: silverlight xaml data-binding


    【解决方案1】:

    终于想通了。留下我的答案,希望它能节省我花在这上面的时间。

    第一课 问题在于我没有为生成的实体自定义 Equality 实现,并且默认引用相等不起作用,因为我使用了两个不同的实例。一旦我在生成的实体上实现了IEquatable(通过服务器端的 .shared.cs 部分类),一切都开始像魅力一样工作了。

    详情请见Silverlight ComboBox Control Population by Manishdalal

    第二课 如果您能提供帮助,请不要使用多个 DDS 控件。尤其是在 DDS 上使用写入操作后,在提交更改之前,您无法加载/刷新共享 DomainContext 的任何其他 DDS。上面的链接显示了当您只想获取实体列表以填充 ComboBox 时,如何使用列表生成器来避免多个 DDS。

    我的新代码如下所示:

    <DataTemplate x:Key="POSItemTemplate">
        <StackPanel d:DataContext="{Binding Source=packageOSDomainDataSource, Path=Data.CurrentItem}">
            <toolkit:DataField Label="OS">
                <ComboBox DisplayMemberPath="Name"
                          ItemsSource="{Binding Path=OSList, Source={StaticResource OSListGenerator}}"
                          SelectedItem="{Binding Path=OS, Mode=TwoWay}" />
            </toolkit:DataField>
        </StackPanel>
    </DataTemplate>
    

    OSListGenerator 在从DomainContext 加载后通过其OSList 属性返回IEnumerable&lt;OSEntity&gt;

    第三课 在 DDS DataTemplate 中,您必须明确使用双向绑定。这是新的行为;由于我提到的大多数教程都使用 SL3,我花了好几天才弄清楚,我没有意识到这是 SL4 中 DDS DataTemplate 行为的重大变化。

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多