1

我有一个场景,需要在网格中显示一堆数据,但它以如此复杂的方式使用列组和行组,以至于我们无法使用数据网格。我们所拥有的是在 A、B 和 C 行中具有垂直列组 c1 和 c2 的部分组。并且可能会显示此控件的 2 个版本。

A最多可以有5个。每个A最多可以有5个B,每个B有8个C,每个C在c1中有5个属性,在c2中有5个属性。

这些 B 中的每一个都打印出 C 的标签,然后是 c1 的该标签的所有值,然后是 c2 下该标签的所有属性。

每个 C 都可以隐藏、显示或突出显示,由网格外的不确定复选框控制。

我遇到的问题是,在第 5 个 A 附近,它下面的所有 C 开始失去与复选框的绑定(通过相对绑定绑定)。

一个属性可以绑定多少次以使其停止评估绑定是否有限制?每个 C 都有自己的复选框,它们几乎同时发出。事情是它都是一个 ItemsControl 所以它在最后一次迭代中 - 前 4 次没有任何变化,这一切都完成了,这只是控件的第 5 次迭代。

如果我删除其中一个 C 以减少需要处理的内容,问题就会消失。如果我添加另一个,问题会更早发生。

我已经绘制了一个快速图像来显示我在这里谈论的内容: 在此处输入图像描述 请注意,任何 C 都可以突出显示或隐藏。但是在某一点之后,问题是突出显示和隐藏简单地停止了。输出窗口中没有错误,异常,没有任何内容。绑定只是停止被评估。


更新

看来是有限制的。如果我使用以下 xaml 进行测试:

        <ItemsControl ItemsSource="{Binding TestCollection}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Index}" Visibility="{Binding DataContext.TestVisibility, RelativeSource={RelativeSource AncestorType=navigation:Page}}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

并像这样在我的视图模型中填充它:

        List<TestModelObject> initList = new List<TestModelObject>();
        for (int i = 0; i < 15000; i++)
        {
            initList.Add(new TestModelObject(i));
        }

        TestCollection = new ObservableCollection<TestModelObject>(initList);

并在我的 ViewModel 中将 TestVisibility 设置为 false。在运行它并让它处理之后,因为一次将 15K 项添加到 UI 需要一点时间,如果我的 ItemsControl 中的整数从 9640 左右开始,我会得到一个列表。但是,如果我重新加载,我每次都会得到一个稍微不同的数字。它基于执行时间吗?

我在 Silverlight 5 和 Silverlight 4 中都对此进行了测试。对于 silverlight 4,我当然使用了 RelativeBinding 的解决方法,但结果是相同的。

4

1 回答 1

0

据我所知,没有也不应该有约束力的限制。

如果我在哪里猜,我会说您在 C 上覆盖 Equals 或 GetHashCode。(或者因为您在同一个容器中多次使用相同的 C 实例,不清楚您是否这样做)。当多个项目彼此相等,或者相等的项目不相等时,应该或类似的一些与选择相关的非常奇怪的事情可能会发生,就像你上面描述的那样。确保每个 C 实例都会产生唯一的相等和/或哈希码值。

于 2012-06-14T20:18:41.553 回答