DataTemplateSelector在保存时丢失数据

本文关键字:数据 保存 DataTemplateSelector | 更新日期: 2023-09-27 17:49:19

我甚至不知道该怎么称呼它,所以让我解释一下这个场景,希望能让别人灵光一闪。我不能做一个完整的代码共享来复制,因为它只是不是一个选项,无论如何我离题了。

那么,这是基本的。

    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(不,我没有做这个,我不能重写它)。

这是让我困惑的奇怪的神秘部分,我会尽我所能解释。

在屏幕初始加载时一切都很好,数据加载很好,一切都很好。然而,在保存时(即使没有任何更改),一旦繁忙指示器处置,那么只有datagrid的列标题将保持可见,直到你调整屏幕的大小,即使是最轻微的一点。我认为导致sizechangedupdatelayout ()?

我的问题是,有人见过这种行为吗?为什么每个模板的DataGrid呈现列标头,但然后不呈现行,直到一个sizechange事件,最重要的是,我怎么能解决这个问题?

我尝试了我能想到的第一件事,就像硬设置一些大小,因为我在黑暗中拍摄了这样一个事实,即改变窗口大小,即使是最轻微的一点,也会导致数据返回视图,但在现实中,我被难住了,这样做只是使它更不可预测地再现。

我很乐意为任何能拯救我理智的人买啤酒。谢谢。

DataTemplateSelector在保存时丢失数据

这确实有点耳熟。我不得不对抗类似的DataGrid渲染问题。以下是我的故事:

当我们添加列时,内容消失或完全是白色的,过了一会儿我发现当所有列的总宽度超过一定数量时就会发生这种情况。我不认为它是Int32.MaxValue,它可能是一个较小的数,可能是2的幂,但这并不重要,也不是必需的。(见下面我的解释)

所以你的保存操作的繁忙指示器可能会以任何方式影响visualState,一些焦点边界或其他东西可能会被渲染,只是达到这个神奇的限制,溢出会发生

现在想象一些代码,例如计算一个contentPanel或Presenter(或任何与显示你的内容相关的)的宽度,总结所有的部分,溢出发生了,结果会是什么?对,没错,宽度会远小于0。因此,它实际上可能是由引擎呈现的,要么是在屏幕外,要么是在元素的实际显示区域之外。

你实际上可以复制这一点,并见证它与TextBox在一个尝试项目:有一个文本框,并通过Ctrl+ a, Ctrl+C, Ctrl+V,和onTextChanged -> Debug.WriteLine(TextBox . text . getrenderedwidth())填充随机字符。(GetRenderedWidth是我写的一个扩展方法,可以给你的代码,如果你想。但它并不是非常准确。)一旦渲染宽度达到39,235左右,你就可以看到Ctrl+ a文本高亮显示的变化:内容消失了!但实际上它只是呈现为负方向(你可以打开EnableRedrawRegions以看到它呈现在错误的方向)。当您再次删除最后一个字符时,一切都恢复正常。

所以我的建议是:打开EnableRedrawRegions,看看当你的渲染问题发生时,你是否能看到重绘区域的变化。如果你能发现DataGrid左边画了一个区域,很有可能那就是你的网格内容。

[编辑1]如果事实证明是网格的visualState更改在某种程度上导致了这个错误,您的修复可能像onBusyIndicatorDone -> VisualStateManager.GoToState(grid,"normal",false);

一样简单。

[编辑2]您可以使用InvalidateArrange或invalidatemmeasure: grid.InvalidateArrange()grid.InvalidateMeasure()触发重绘