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

时间:2015-05-03 19:00:24

标签: c# wpf mvvm

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

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

现在我的问题。作为性能提示,建议通过以下方式调用add for new data(尤其是几个数据):

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

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

我见过(再也找不到帖子):

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

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

对此建议或解决方案提案的任何想法?

1 个答案:

答案 0 :(得分:1)

我会使用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的引用。

虽然行为是WPF中的一个概念,但它只会作为 View 中的代码,使您的 ViewModel 保持清除任何引用到UI元素直接。