如何从自己的 collection 自动更新 ItemsSource?

How to update ItemsSource automatically from own collection?

我创建了自己的 collection 并实现了 INotifyCollectionChanged。

public class ObservableSortedSet<T> : SortedSet<T>, INotifyCollectionChanged
{
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public new bool Add(T item)
    {
        var result = base.Add(item);
        if (result)
            CollectionChanged?.Invoke(item,
                new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
        return result;
    }

    public new bool Remove(T item)
    {
        var result = base.Remove(item);
        if (result)
            CollectionChanged?.Invoke(item,
                new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item));
        return result;
    }

    public new void Clear()
    {
        base.Clear();
        CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}

然而,当我尝试将此 collection 用作视图中的 ItemsSource 时,它​​们不会自动更新,例如删除一个项目。正如我在这里的其他问题中看到的那样,我应该实施 INotifyCollectionChanged。我这样做了,但它不起作用。有什么建议吗?

你的remove方法不起作用的原因是你必须添加删除元素的索引。

我这样试过,确实有效:

查看代码隐藏:

public ObservableSortedSet<String> Values { get; private set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        Values = new ObservableSortedSet<string>();
        Values.Add("Test0");
        Values.Add("Test1");
        Values.Add("Test2");
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Values.Add("Test" + Values.Count);
    }
}

查看:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <ListView ItemsSource="{Binding Path=Values}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

    <Button Grid.Row="1" Content="Add" Click="Button_Click"/>
</Grid>