如何在向模型添加数据时暂停视图更新?

How can I suspend updates for my view while adding data to the model?

我正在使用第 3 方图表组件。该组件分为两部分:

一个图表UI组件和一个绑定到图表数据系列属性的数据系列对象。对于这个数据对象,我可以添加新的点,然后在图表上呈现。这就是文档中描述的方式,它让我有可能在我的 ViewModel 中甚至在非 UI 线程上添加新点。它工作得很好,我的 View 与 ViewModel 分开了。

现在是我的问题。作为性能提示,建议按以下方式为新数据(尤其是多个数据)调用添加:

using (graph.SuspendUpdate)
{
    dataseries.Add(manyPointsList);
}

但是我在 ViewModel 中没有图表。 WPF 或现有的 MVVM 模式是否有可能处理此问题?

我看过(又找不到post):

using (Dispatcher.CurrentDispatcher.DisableProcessing())
{
    dataseries.Add(manyPointslist);
}

但这真的是等价的吗?
我不会假设它是 WPF 吗?我的 ViewModel 可以在 WinForms 中使用(理论上),我认为 MVVM 的目标是在 ViewModel 中没有视图细节(尽管禁用渲染也可以被视为 UI 特定)。

对此有任何想法或解决方案建议吗?

为此我会使用 Behavior

public class SuspendBehavior : Behavior<THE_TYPE_OF_YOUR_CHART/GRAPH>
{
    private IDisposable disposable;

    public static readonly DependencyProperty SuspendUpdateProperty = DependencyProperty.Register(
        "SuspendUpdate", typeof(bool), typeof(SuspendBehavior), new PropertyMetadata(default(bool), OnSuspendUpdateChanged));

    public bool SuspendUpdate
    {
        get { return (bool) GetValue(SuspendUpdateProperty); }
        set { SetValue(SuspendUpdateProperty, value); }
    }

    private static void OnSuspendUpdateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var behavior = d as SuspendBehavior;

        var value = (bool) e.NewValue;
        if (value)
        {
            // AssociatedObject would be your graph
            behavior.disposable = behavior.AssociatedObject.SuspendUpdate ...
        }
        else
        {
            if (behavior.disposable != null)
                behavior.disposable.Dispose();
        }
    }
}

将行为附加到您的图表或图形中

    <i:Interaction.Behaviors>
        <local:SuspendBehavior SuspendUpdate="{Binding ShouldSuspend}"/>
    </i:Interaction.Behaviors>

并将 ShouldSuspend bool 属性 添加到您的 viewModel 中,这将在您添加新点时设置

ShouldSuspend = true;
dataseries.Add(manyPointsList);
ShouldSuspend = false;

这将要求您添加对 System.Windows.Interactivity 的引用。

虽然 Behaviors 是 WPF 中的一个概念,但它只会在您的 View 中作为代码隐藏,从而使您的 ViewModel 直接清除对 UI 元素的任何引用。