Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅显示ItemsControl的一部分';首先是什么来源_C#_Wpf - Fatal编程技术网

C# 仅显示ItemsControl的一部分';首先是什么来源

C# 仅显示ItemsControl的一部分';首先是什么来源,c#,wpf,C#,Wpf,我有一个ItemsControl显示文件集合。这些文件是按最近的修改排序的,而且有很多 所以,我希望最初只显示其中的一小部分(比如说,只有20个左右),并显示一个标记为“显示更多”的按钮,单击该按钮时将显示所有内容 我已经有了一个解决方案,但它涉及到在我的视图模型的源属性上使用一个好的旧LINQTake。我想知道是否有更干净的方法 谢谢。要做到这一点,您需要在数据上创建某种“视图”。WPF框架中没有任何东西可以免费为您提供此功能。在我看来,一个简单的Linq,Take(),是一个干净而简单的解决

我有一个ItemsControl显示文件集合。这些文件是按最近的修改排序的,而且有很多

所以,我希望最初只显示其中的一小部分(比如说,只有20个左右),并显示一个标记为“显示更多”的按钮,单击该按钮时将显示所有内容

我已经有了一个解决方案,但它涉及到在我的视图模型的源属性上使用一个好的旧LINQ
Take
。我想知道是否有更干净的方法


谢谢。

要做到这一点,您需要在数据上创建某种“视图”。WPF框架中没有任何东西可以免费为您提供此功能。在我看来,一个简单的Linq,
Take()
,是一个干净而简单的解决方案。

为什么不让您分配给ItemsSource的对象处理这个逻辑?在第一次分配时,它会报告有限的项子集。单击“显示更多”时,对象将更新为显示更多(或所有条目),然后通知框架属性已更改(例如,使用IPropertyNotifyChanged)

公共类MyItemSource
{
私有列表源={…};
公共MyItemSource()
{
this.ShowThisMany=20;
}
公共int显示了这么多
{
得到;
set;//这应该调用\使用INotifyPropertyChanged接口
}
公共IEnumerable this[]
{
返回this.source.Take(this.ShowThisMany);
}
}
...
MyItemsSource MyItemsSource=新的MyItemsSource();
ItemsControl.Source=myItemsSource;
...
单击ShowMore时无效(…)
{
myItemsSource.ShowThisMany=50;
}
.Take()
在我看来相当干净。
public class MyItemSource
{
    private List<string> source = { ... };

    public MyItemSource()
    {
        this.ShowThisMany = 20;
    }

    public int ShowThisMany
    {
        get;
        set; // this should call\use the INotifyPropertyChanged interface
    }

    public IEnumerable<string> this[]
    {
        return this.source.Take(this.ShowThisMany);
    }
}

...
MyItemsSource myItemsSource = new MyItemsSource();
ItemsControl.Source = myItemsSource;
...

void OnShowMoreClicked(...)
{
    myItemsSource.ShowThisMany = 50;
}