如何在向模型添加数据时暂停视图更新?
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 元素的任何引用。
我正在使用第 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 元素的任何引用。