Skip to content

Commit d1ca572

Browse files
authored
Make BindingList adaptors replace the changed item instead of re-adding (#694)
1 parent 82c9639 commit d1ca572

2 files changed

Lines changed: 27 additions & 22 deletions

File tree

src/DynamicData/Binding/BindingListAdaptor.cs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -119,23 +119,18 @@ private static void DoUpdate(IChangeSet<TObject, TKey> changes, BindingList<TObj
119119
break;
120120

121121
case ChangeReason.Update:
122-
var item = update.Previous.Value;
123-
124-
if (item is not null)
125-
{
126-
list.Remove(item);
127-
}
128-
129-
list.Add(update.Current);
122+
var previousIndex = list.IndexOf(update.Previous.Value);
123+
if (previousIndex >= 0)
124+
list[previousIndex] = update.Current;
125+
else
126+
list.Add(update.Current);
130127
break;
131128

132129
case ChangeReason.Refresh:
133-
{
134-
var index = list.IndexOf(update.Current);
135-
if (index != -1)
136-
list.ResetItem(index);
137-
break;
138-
}
130+
var index = list.IndexOf(update.Current);
131+
if (index != -1)
132+
list.ResetItem(index);
133+
break;
139134
}
140135
}
141136
}

src/DynamicData/Binding/SortedBindingListAdaptor.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,27 @@ private void DoUpdate(ISortedChangeSet<TObject, TKey> changes)
100100
break;
101101

102102
case ChangeReason.Update:
103-
_list.RemoveAt(change.PreviousIndex);
104-
_list.Insert(change.CurrentIndex, change.Current);
103+
if (change.CurrentIndex != change.PreviousIndex)
104+
{
105+
_list.RemoveAt(change.PreviousIndex);
106+
_list.Insert(change.CurrentIndex, change.Current);
107+
}
108+
else
109+
{
110+
var previousIndex = _list.IndexOf(change.Previous.Value);
111+
if (previousIndex >= 0)
112+
_list[previousIndex] = change.Current;
113+
else
114+
_list.Add(change.Current);
115+
}
116+
105117
break;
106118

107119
case ChangeReason.Refresh:
108-
{
109-
var index = _list.IndexOf(change.Current);
110-
if (index != -1)
111-
_list.ResetItem(index);
112-
break;
113-
}
120+
var index = _list.IndexOf(change.Current);
121+
if (index != -1)
122+
_list.ResetItem(index);
123+
break;
114124
}
115125
}
116126
}

0 commit comments

Comments
 (0)