DataTemplateSelector消失了关于保存神秘的数据

时间:2016-06-24 21:31:22

标签: c# silverlight datagrid datatemplate

我甚至不确定该怎么称呼它让我解释一下这个场景,并希望有一个灯泡可供其他人使用。我不能完整的代码共享来重现,因为它不是一个选项,无论如何我离题。

所以,这是基础知识。

通过;

设置多个DataTemplate
    public DataTemplate ABCTemplate
    {
        get { return (DataTemplate) GetValue(ABCTemplateProperty); }
        set { SetValue(ABCTemplateTemplateProperty, value); }
    }

通过;

换出
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var something = (thestuff)item;

        switch (something.Id)
        {
            case (int)thestuff.Type.ABC: { return ABCTemplate; }
            case (int)thestuff.Type.DEF: { return DEFTemplate; }
            case (int)thestuff.Type.GHI: { return GHITemplate; }
            case (int)thestuff.Type.JKL: { return JKLTemplate; }
        }

        return base.SelectTemplate(item, container);
    }

等,等等。每个DataTemplate都是一个DataGrid(不,我没有做到这一点,我不能重写它)。

这里有一个奇怪的神秘部分让我难以理解,我会尽力解释。

在屏幕初始加载时一切都很好,数据加载正常,一切都很好。然而,一旦忙碌指示器处理完毕,那么一旦保存(即使没有任何变化),那么只有DataGrids的列标题仍然可见 UNTIL ,即使是最轻微的一点,您也可以调整屏幕大小。我假设导致SizeChanged为UpdateLayout()?

我的问题是,有没有人见过这种行为?为什么每个模板的DataGrid都会渲染列标题,然后才会渲染行直到只有一个SizeChanged事件,最重要的是,我该如何修复这个P.O.S?

我尝试了第一个我能想到的东西,比如只是硬设置一些尺寸,因为我在黑暗中拍摄了一个事实,即改变窗口大小甚至最轻微的一点都会导致数据返回到视图但实际上,我和#39; m stumped并且这样做只是让它不那么可预测地重现。

我很高兴为任何可以拯救我理智的人买啤酒。感谢。

1 个答案:

答案 0 :(得分:1)

这确实敲响了钟声。我不得不打一个类似的DataGrid渲染问题。这是我的故事:

当我们添加列时内容消失或完全变白,过了一会儿我发现当所有列的组合宽度超过某个数字时发生了。我不认为它是Int32.MaxValue,它可能是一个较小的数字,也许它是2的幂,但这并不重要或不需要。 (详见我的解释)

因此,您的保存操作繁忙指示符可能以任何方式影响visualState,某些焦点边框或内容可能会呈现并且只是达到这个神奇的限制,就会发生溢出。

现在想象一些代码,例如计算contentPanel或Presenter的宽度(或与显示内容相关的任何内容)总结所有部分,并发生溢出,结果是什么?是的,确切地说,宽度将是负面的。因此它实际上可能由引擎渲染​​,无论是在屏幕外还是在元素的实际显示区域之外。

你可以实际重现这一点,并在试用项目中用TextBox见证它:有一个TextBox并用Ctrl + A,Ctrl + C,Ctrl + V和onTextChanged填充随机字符 - >的Debug.WriteLine(textbox.Text.GetRenderedWidth())。 (GetRenderedWidth是我写的扩展方法,如果你愿意,可以给你代码。但它不是非常准确。) 一旦渲染宽度达到ca. 39,235你可以看到Ctrl + A文字荧光笔渲染的变化:内容消失了!但实际上它只是被渲染到负方向(你可以打开EnableRedrawRegions看它以错误的方向渲染)。当你再次移除最后一个角色时,一切都恢复正常。

所以我的建议是:启用EnableRedrawRegions,看看当渲染问题发生时你是否可以看到重绘区域的变化。如果您可以看到DataGrid左侧绘制的区域,那么这可能就是您的网格内容。

[编辑1] 如果事实证明网格的visualState更改以某种方式导致此错误,那么您的修复可能就像onBusyIndi​​catorDone一样简单 - > VisualStateManager.GoToState(grid,"normal",false);

[编辑2] 您可以使用InvalidateArrangeInvalidateMeasuregrid.InvalidateArrange()grid.InvalidateMeasure()

触发重绘