如何从自己的 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>
我创建了自己的 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>