C# MVVM模式下的WPF数据虚拟化

C# MVVM模式下的WPF数据虚拟化,c#,wpf,mvvm,C#,Wpf,Mvvm,,, 我想知道如何在mvvm模式中实现数据虚拟化? 我已经搜索过了,但没有找到使用mvvm模式的数据虚拟化 这个链接描述了非常好的数据虚拟化,但不是在mvvm中 因此,请提供一个链接或示例 using System; using System.Collections.Generic; using System.Windows; using System.Windows.Threading; namespace DataVirtualization { /// <summary>

,, 我想知道如何在mvvm模式中实现数据虚拟化? 我已经搜索过了,但没有找到使用mvvm模式的数据虚拟化

这个链接描述了非常好的数据虚拟化,但不是在mvvm中

因此,请提供一个链接或示例

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Threading;

namespace DataVirtualization
{
/// <summary>
/// Interaction logic for DemoWindow.xaml
/// </summary>
public partial class DemoWindow
{
    /// <summary>
    /// Initializes a new instance of the <see cref="DemoWindow"/> class.
    /// </summary>
    public DemoWindow()
    {
        InitializeComponent();

        // use a timer to periodically update the memory usage
        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = new TimeSpan(0, 0, 1);
        timer.Tick += timer_Tick;
        timer.Start();
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        tbMemory.Text = string.Format("{0:0.00} MB", GC.GetTotalMemory(true)/1024.0/1024.0);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // create the demo items provider according to specified parameters
        int numItems = int.Parse(tbNumItems.Text);
        int fetchDelay = int.Parse(tbFetchDelay.Text);
        DemoCustomerProvider customerProvider = new DemoCustomerProvider(numItems, fetchDelay);

        // create the collection according to specified parameters
        int pageSize = int.Parse(tbPageSize.Text);
        int pageTimeout = int.Parse(tbPageTimeout.Text);

        if ( rbNormal.IsChecked.Value )
        {
            DataContext = new List<Customer>(customerProvider.FetchRange(0, customerProvider.FetchCount()));
        }
        else if ( rbVirtualizing.IsChecked.Value )
        {
            DataContext = new VirtualizingCollection<Customer>(customerProvider, pageSize);
        }
        else if ( rbAsync.IsChecked.Value )
        {
            DataContext = new AsyncVirtualizingCollection<Customer>(customerProvider, pageSize, pageTimeout*1000);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Windows;
使用System.Windows.Threading;
命名空间数据虚拟化
{
/// 
///DemoWindow.xaml的交互逻辑
/// 
公共部分类演示窗口
{
/// 
///初始化类的新实例。
/// 
公共窗口()
{
初始化组件();
//使用计时器定期更新内存使用情况
调度程序计时器=新调度程序();
timer.Interval=新的时间跨度(0,0,1);
timer.Tick+=定时器_Tick;
timer.Start();
}
私有无效计时器(对象发送方、事件参数)
{
tbMemory.Text=string.Format(“{0:0.00}MB”,GC.GetTotalMemory(true)/1024.0/1024.0);
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
//根据指定的参数创建演示项目提供程序
int numItems=int.Parse(tbNumItems.Text);
int fetchDelay=int.Parse(tbFetchDelay.Text);
DemoCustomerProvider customerProvider=新的DemoCustomerProvider(numItems,fetchDelay);
//根据指定的参数创建集合
int pageSize=int.Parse(tbPageSize.Text);
int pageTimeout=int.Parse(tbPageTimeout.Text);
if(rbNormal.IsChecked.Value)
{
DataContext=新列表(customerProvider.FetchRange(0,customerProvider.FetchCount());
}
else if(rbvirtualization.IsChecked.Value)
{
DataContext=新的VirtualzingCollection(customerProvider,pageSize);
}
else if(rbAsync.IsChecked.Value)
{
DataContext=new AsyncVirtualizangCollection(customerProvider,pageSize,pageTimeout*1000);
}
}
}
}


谢谢

只需从数据源中检索前N项,然后保留并索引“当前位置”。你试过什么?顺便说一句,代码很可怕。编写它的人对WPF一无所知,并试图像winforms一样使用它。大失败。感谢您的评论,我想问一下如何使用MVVM实现数据虚拟化,我已经尝试使用传统的方式在MVVM 2按钮(上一个,下一个)中进行分页,绑定到命令,设置页面大小,并在我的linq中使用分页,但我需要通过使用数据虚拟化来摆脱这些按钮,用户会觉得自己获得了所有数据。我知道这很可怕,但这是我发现的,如果您有更好的建议,请提供。我不确定我是否完全理解您的问题,因为
虚拟化
是在UI控件中执行的,与视图模型无关。也许你说的是寻呼?在之前实现了一些动画虚拟化控件之后,我可以告诉您,这不是为那些心虚的人准备的。。。这是相当复杂的事情。然而,如果您决心遵循这条道路,那么我建议您通读WPF Control Development Unreleased book的第8章,这本书有一个很好的描述和示例。我设法找到了一份[在线副本](@Sheridan OP询问有关数据虚拟化的问题,这与UI虚拟化不同。OP多次提到数据虚拟化,因此谈论其他内容根本无法提供解决方案。我会尝试查看以下页面:,它将引导您了解所有数据虚拟化基础知识,这也是我目前编写自己的I实施。