【问题标题】:How to get a untyped ObservableCollection from a DataContext?如何从 DataContext 中获取无类型的 ObservableCollection?
【发布时间】:2023-03-15 09:38:01
【问题描述】:

我需要从 DataContext 获取无类型的 QueryableCollection 来查询它。我有以下代码:

printAbleListView = (ListView) printObject.FindName("printAbleListView");
// Here I like to have something like ObservableCollection<Object>
ObservableCollection<Journal> allItems = (ObservableCollection<Journal>) printAbleListView.DataContext;

// Add the page to the page preview collection
for (int i = 0; i <= (allItems.Count()/30); i++)
{
  printAbleListView.DataContext = null;
  printAbleListView.DataContext = allItems.Skip(30 * i).Take(30);
  document.SetPreviewPage((i + 1), printObject);
}

目标是打印出 Metro 风格 Windows 8 应用程序中的任何 ListView。目前它被输入到Journal DataType,但我喜欢让它没有类型化,这样这个函数就可以被每个 ListView 重用,而不仅仅是 Journal 的。我可以存档吗?

【问题讨论】:

  • 也许你只是想让函数通用?
  • 也许可以,但我不知道怎么做。能举个例子吗?

标签: c# windows-8 observablecollection untyped-variables


【解决方案1】:

例子:

void GeneratePreview<T>(int itemsPerPage)
{
    var printAbleListView = (ListView)printObject.FindName("printAbleListView");
    var allItems = (ObservableCollection<T>)printAbleListView.DataContext;

    // Add the page to the page preview collection
    for (int i = 0; i <= (allItems.Count()/itemsPerPage); i++)
    {
      printAbleListView.DataContext =
              allItems.Skip(itemsPerPage * i).Take(itemsPerPage);
      document.SetPreviewPage((i + 1), printObject);
    }
}

对于无类型访问,你实际上可以使用ObservableCollection&lt;T&gt;支持非泛型ICollection这一事实:

void GeneratePreview(int itemsPerPage)
{
    var printAbleListView = (ListView)printObject.FindName("printAbleListView");
    var allItems = (ICollection)printAbleListView.DataContext;

    var slice = new List<object>(itemsPerPage); // cannot use ArrayList for Win8 apps
    var pageNo = 1;
    foreach (var item in allItems)
    {            
        slice.Add(item);
        if (slice.Count % itemsPerPage == 0)
        {
            // flush
            printAbleListView.DataContext = slice;
            document.SetPreviewPage(pageNo, printObject);
            // and restart
            pageNo++;
            slice.Clear();
        }
    }
    if (slice.Count != 0) // flush the rest
    {
        printAbleListView.DataContext = slice;
        document.SetPreviewPage(pageNo, printObject);
    }
    // clean up
    printAbleListView.DataContext = null;
}

【讨论】:

  • 谢谢,我会试试这个。对于您的问题,基本上我希望 ListView 在每次迭代中仅显示 30 个条目。有没有更简单的方法?
  • @Jan:好吧,但是代码将通过所有迭代而无需等待,您总是会得到最后一个。我修改一下代码,等一下……
  • @Jan:哦,我想我明白其中的逻辑了。你的意思是document.SetPreviewPage 在每次迭代中拍摄printObject 的快照?
  • 是的,printObject 应该是 ListView 的 30 个项目的快照以打印出来。每次迭代都是一页。这工作正常,但我希望它没有类型。我仍然必须调用你的函数类型(例如GeneratePreview&lt;Journal&gt;(30);)。是否有可能获取类型并将其传递给泛型函数。 GeneratePreview&lt;printAbleListView.Items.GetType()&gt;(30); 之类的东西?
  • @Jan:添加了无类型访问的版本。对于无类型版本,没有可用的 LINQ 工具,无需稍微重构逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
相关资源
最近更新 更多