我正在使用第三方图表组件。该组件分为两部分:
图表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特定)。
对此建议或解决方案提案的任何想法?
答案 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元素直接。