Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ChangeKind.Clear #29

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions sandbox/ConsoleApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ public void OnCollectionChanged(
case ChangedKind.Move:
view.Value += $" Move {eventArgs.OldStartingIndex} {eventArgs.NewStartingIndex}";
break;
case ChangedKind.Clear:
view.Value += $" Clear";
break;
default:
throw new ArgumentOutOfRangeException(nameof(changedKind), changedKind, null);
}
Expand Down
10 changes: 7 additions & 3 deletions sandbox/WpfApp/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,19 @@
xmlns:local="clr-namespace:WpfApp"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<!--<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>

<ListView ItemsSource="{Binding ItemsView}"></ListView>

<Button Grid.Column="1" Click="Button_Click">Insert</Button>

</Grid>
</Grid>-->

<StackPanel>
<ListBox ItemsSource="{Binding ItemsView}" />
<Button Content="Clear" Command="{Binding ClearCommand}" />
</StackPanel>
</Window>
68 changes: 52 additions & 16 deletions sandbox/WpfApp/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using ObservableCollections;
using R3;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
Expand All @@ -22,38 +24,72 @@ namespace WpfApp
/// </summary>
public partial class MainWindow : Window
{
ObservableList<int> list;
public INotifyCollectionChangedSynchronizedView<int> ItemsView { get; set; }
//ObservableList<int> list;
//public INotifyCollectionChangedSynchronizedView<int> ItemsView { get; set; }




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


R3.WpfProviderInitializer.SetDefaultObservableSystem(x =>
{
Trace.WriteLine(x);
});

this.DataContext = new ViewModel();

list = new ObservableList<int>();
list.AddRange(new[] { 1, 10, 188 });
ItemsView = list.CreateSortedView(x => x, x => x, comparer: Comparer<int>.Default).ToNotifyCollectionChanged();


BindingOperations.EnableCollectionSynchronization(ItemsView, new object());

//list = new ObservableList<int>();
//list.AddRange(new[] { 1, 10, 188 });
//ItemsView = list.CreateSortedView(x => x, x => x, comparer: Comparer<int>.Default).ToNotifyCollectionChanged();


//BindingOperations.EnableCollectionSynchronization(ItemsView, new object());
}

int adder = 99;
//int adder = 99;

private void Button_Click(object sender, RoutedEventArgs e)
//private void Button_Click(object sender, RoutedEventArgs e)
//{
// ThreadPool.QueueUserWorkItem(_ =>
// {
// list.Add(adder++);
// });
//}

//protected override void OnClosed(EventArgs e)
//{
// ItemsView.Dispose();
//}
}

public class ViewModel
{
private ObservableList<int> observableList { get; } = new ObservableList<int>();
public INotifyCollectionChangedSynchronizedView<int> ItemsView { get; }
public ReactiveCommand<Unit> ClearCommand { get; } = new ReactiveCommand<Unit>();

public ViewModel()
{
ThreadPool.QueueUserWorkItem(_ =>
observableList.Add(1);
observableList.Add(2);

ItemsView = observableList.CreateView(x => x).ToNotifyCollectionChanged();

BindingOperations.EnableCollectionSynchronization(ItemsView, new object());

// var iii = 10;
ClearCommand.Subscribe(_ =>
{
list.Add(adder++);
// observableList.Add(iii++);
observableList.Clear();
});
}

protected override void OnClosed(EventArgs e)
{
ItemsView.Dispose();
}
}
}
6 changes: 6 additions & 0 deletions sandbox/WpfApp/WpfApp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="R3" Version="1.0.4" />
<PackageReference Include="R3Extensions.WPF" Version="1.0.4" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\ObservableCollections.R3\ObservableCollections.R3.csproj" />
<ProjectReference Include="..\..\src\ObservableCollections\ObservableCollections.csproj" />
</ItemGroup>

Expand Down
7 changes: 6 additions & 1 deletion src/ObservableCollections/ISynchronizedViewFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public interface ISynchronizedViewFilter<T, TView>

public enum ChangedKind
{
Add, Remove, Move
Add, Remove, Move, Clear
}

public class SynchronizedViewFilter<T, TView> : ISynchronizedViewFilter<T, TView>
Expand Down Expand Up @@ -106,6 +106,11 @@ internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TVie
filter.OnCollectionChanged(ChangedKind.Move, value, view, eventArgs);
}

internal static void InvokeOnClear<T, TView>(this ISynchronizedViewFilter<T, TView> filter, in NotifyCollectionChangedEventArgs<T> eventArgs)
{
filter.OnCollectionChanged(ChangedKind.Clear, default!, default!, eventArgs);
}

internal static void InvokeOnAttach<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view)
{
if (filter.IsMatch(value, view))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in
case ChangedKind.Move:
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, view, eventArgs.NewStartingIndex, eventArgs.OldStartingIndex));
break;
case ChangedKind.Clear:
PropertyChanged?.Invoke(this, CountPropertyChangedEventArgs);
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
break;
default:
throw new ArgumentOutOfRangeException(nameof(changedKind), changedKind, null);
}
Expand Down
36 changes: 15 additions & 21 deletions src/ObservableCollections/ObservableList.Views.cs
Original file line number Diff line number Diff line change
Expand Up @@ -210,34 +210,28 @@ private void SourceCollectionChanged(in NotifyCollectionChangedEventArgs<T> e)
break;
case NotifyCollectionChangedAction.Replace:
// ObservableList does not support replace range
{
var v = (e.NewItem, selector(e.NewItem));
{
var v = (e.NewItem, selector(e.NewItem));

var oldItem = list[e.NewStartingIndex];
list[e.NewStartingIndex] = v;
var oldItem = list[e.NewStartingIndex];
list[e.NewStartingIndex] = v;

filter.InvokeOnRemove(oldItem, e);
filter.InvokeOnAdd(v, e);
break;
}
filter.InvokeOnRemove(oldItem, e);
filter.InvokeOnAdd(v, e);
break;
}
case NotifyCollectionChangedAction.Move:
{
var removeItem = list[e.OldStartingIndex];
list.RemoveAt(e.OldStartingIndex);
list.Insert(e.NewStartingIndex, removeItem);
{
var removeItem = list[e.OldStartingIndex];
list.RemoveAt(e.OldStartingIndex);
list.Insert(e.NewStartingIndex, removeItem);

filter.InvokeOnMove(removeItem, e);
}
filter.InvokeOnMove(removeItem, e);
}
break;
case NotifyCollectionChangedAction.Reset:
if (!filter.IsNullFilter())
{
foreach (var item in list)
{
filter.InvokeOnRemove(item, e);
}
}
list.Clear();
filter.InvokeOnClear(e);
break;
default:
break;
Expand Down
Loading