【发布时间】:2019-08-15 12:59:56
【问题描述】:
我想将 ObservableCollection 的前 N 个项目绑定到 ItemsControl。
我试过这个解决方案: Binding to first N items in an ObservableCollection on a ListView
这是我的代码:
XAML:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<ItemsControl x:Name="IC" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="#cecece" BorderThickness="0,0,0,1" Background="Transparent" >
<TextBlock Text="{Binding ABC}"></TextBlock>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel></VirtualizingStackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<Button Grid.Column="1" Click="Button_Click"></Button>
</Grid>
</Window>
代码隐藏:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
IC.ItemsSource = CM.TopCollection;
}
CollectionModel CM = new CollectionModel();
public class TestModel {
public string ABC { get; set; }
}
public class CollectionModel : ObservableCollection<TestModel>, INotifyPropertyChanged
{
public CollectionModel()
{
CollectionChanged += MyCollection_CollectionChanged;
}
private void MyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{ // to notify XAML-side binding
OnPropertyChanged(new PropertyChangedEventArgs(nameof(TopCollection)));
}
public IEnumerable<TestModel> TopCollection => this.Take(10);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
CM.Add(new TestModel() {ABC= Guid.NewGuid().ToString() });
}
}
}
我点击了按钮。不过CM添加新项目成功,但是UI没有更新。
为什么会这样?
我使用断点测试,发现CollectionChanged&OnPropertyChanged 都可以工作。但是为什么UI还是没有更新呢?
你能帮帮我吗?谢谢。
【问题讨论】:
-
现在,您只需设置 ItemsSource 一次。但是您需要在更新实际支持数据后对其进行更新。通常,这是通过
Bindings完成的(您也可以在上面的代码中部分使用它)......理论上可以通过一些附加属性或一些 CollectionViewSource
标签: c# wpf observablecollection